从像 '+-hh:mm' 这样的字符串中提取 NSTimeZone

extract NSTimeZone from string like '+-hh:mm'

在我的应用程序中,我从 API 下载一些数据作为 JSON,其中包含一个带有本地时间的条目:

"local_date" : "2015-07-08T13:18:14+02:00"

JSON数据被解析为NSDictionary* information:

NSDateFormatter* dateFormatter= [NSDateFormatter new];
dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *date = [self.dateFormatter dateFromString:information[@"local_date"]];

date 现在已正确设置为 UTC(我需要进行一些计算)但是要在用户界面中显示本地数据,我需要在正确的时区中显示日期。

我的问题是: 我怎样才能从我的字符串中提取 NSTimeZone?我正在寻找类似 NSTimeZone* timeZone = [NSTimeZone parseFromString:@"+02:00"];

的内容

我已经阅读了 NSDateFormatter、NSCalendar 和 NSTimeZone 的文档,但没有找到如何从像我这样的字符串中获取时区。

提前致谢!

再说一次:当你说 "in local time" 时,你的意思是返回的字符串本地,而不是用户?所以我从德国收到了一个日期,我有足够的信息把它变成一个 NSDate 这样我就可以创建一个 NSDateFormatter 来重新创建原始字符串我想要的输出?

首先:时区实际上不在您提供的字符串中。它说 +02:00 告诉你与格林威治标准时间的偏移量。它不会告诉您时区。例如。现在 +02:00 的偏移量可能是 SAST,南非时区,可能是 EET,东欧时区,可能是 CAT,中非时区等。因此没有直接的方法来映射偏移量到区域。

假设你只是想保留偏移量以便以后应用它,luk2302 的建议可能是正确的方向,但我会反其道而行之(我也会注意 QA1480):

NSString *time = @"2015-07-08T13:18:14+02:00"; // or whatever

NSDateFormatter *dateFormatter= [NSDateFormatter new];
dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];

dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *correctDate = [dateFormatter dateFromString:time];

NSDate *dateWithoutOffset = correctDate;
NSRange rangeOfPlus = [time rangeOfString:@"+"];
if(rangeOfPlus.location != NSNotFound)
{
    dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss";
    dateWithoutOffset = [dateFormatter dateFromString:[time substringToIndex:rangeOfPls.location]];     
}

NSLog(@"Offset in date was %0.0f seconds", [dateWithoutOffset timeIntervalSinceDate:correctDate]);

因为你在做一些迟钝和不寻常的事情——普通应用程序只处理固定日期格式字符串,日期没有时区(如在 NSDates 内),并且在 [=23] 中显示内容=]用户的当地时间——您可能需要手动存储和处理偏移量。