我正在尝试使用以下代码将字符串日期(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。我做错了什么?
谢谢!
答案 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:
设置格式化程序的时区将无济于事。如果您希望它们具有不同的时区,则需要创建一个新的。