格式化NSDate对象会更改时区

时间:2012-07-15 13:14:46

标签: ios cocoa-touch nsdate nsdateformatter

我使用以下代码

在用户时区获取当前的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的格式而不是时间,我做错了什么?

1 个答案:

答案 0 :(得分:6)

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

[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

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

formatDate:方法中。