3

我使用以下代码在用户时区获取当前 NSDate

-(NSDate *)getCurrentDateinLocalTimeZone
{
NSDate* sourceDate = [NSDate date];

NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

NSDate* destinationDate = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] ;

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

return   [dateFormatter dateFromString: [dateFormatter stringFromDate:destinationDate]];
}

在我的应用程序的其他某个点上,我想将日期格式化为“HH:mm”以用于 UI 目的,所以我使用以下方法

-(NSString *)formatDate:(NSDate *)date
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
dateFormatter.dateFormat = @"HH:mm";
return [dateFormatter stringFromDate:date]; 
}

如果第二种方法的输出比第一种方法的结果移动了 3 小时,我只想更改 NSDate 的格式而不是时间,我做错了什么?

4

1 回答 1

6

getCurrentDateinLocalTimeZone方法调整时区的日期,使用切断时区的格式字符串对其进行格式化,然后将格式化的字符串解析回来。结果NSDate是 UTC 时区(+0000in2012-07-15 16:28:23 +0000表示 UTC 时间)。该formatDate:方法使用dateFormatter为本地时区设置的,产生不同的时间。您应该将格式化程序设置为使用 UTC 来获取正确的时间:替换

[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];

formatDate:方法中。

于 2012-07-15T13:25:30.420 回答