使用nsdateformatter后添加到小时的时区

时间:2011-06-09 16:10:01

标签: iphone timezone nsdate nsdateformatter

我正在尝试使用以下代码将字符串日期(2011-06-08T08:05:00.000-08:00)转换为NSDate:

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
//Translate 2011-06-08T08:05:00.000-08:00 into 2011-06-08T08:05:00.000-0800
stringDate = [stringDate stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange([aDate length] - 5, 5)];
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSZZZ"];  
NSDate *dateFromString = [dateFormatter dateFromString:stringDate];

此时,dateFromString是2011-06-08 16:05:00 +0000。我真正想要的是dateFromString为2011-06-08 08:05:00 -0800。我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

因此,这将没有直接的答案,并假设您的字符串格式将是相同的。我们要提取时区部分(最后5个字符),然后计算我们离开GMT的秒数。 NSTimeZone有一种方便的方法timeZoneForSecondsFromGMT:,可以帮助我们获得所需的内容。这是您需要添加到问题中的代码。

NSString * zoneString = [stringDate substringFromIndex:([stringDate length] - 5)];
NSTimeInterval timeInterval = [[zoneString substringToIndex:3] intValue] * 3600;
timeInterval += [[zoneString substringFromIndex:3] intValue] * 60;

NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:timeInterval]];
[formatter setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss ZZZ"];
NSLog(@"%@", [formatter stringFromDate:dateFromString]);

希望这会对你有所帮助。如果您已经找到了更好的答案,请告诉我们。

原始答案
关于NSDate的一件事是返回的时间总是在GMT中。你不能改变它。您必须使用NSDateFormatter才能正确打印。像这样的东西,

NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"PST"]];
[formatter setTimeStyle:NSDateFormatterFullStyle];
[formatter setDateStyle:NSDateFormatterFullStyle];
NSLog(@"%@", [formatter stringFromDate:[NSDate date]]);

因此,为dateForString:设置格式化程序的时区将无济于事。如果您希望它们具有不同的时区,则需要创建一个新的。