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

时间:2015-07-08 11:32:02

标签: ios nsdate nsdateformatter nstimezone

在我的应用中,我从JSON下载了一些数据API,其中包含当地时间的条目:

"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的文档,但没有找到如何从像我这样的字符串中获取时区。

提前致谢!

1 个答案:

答案 0 :(得分:2)

再说一次:当你在当地时间"说'#34;时,你的意思是返回字符串的本地,而不是用户?所以我收到了来自德国的日期,我有足够的信息将它变成NSDate ,这样我就可以创建一个NSDateFormatter,它重新创建了原始字符串,即输出I想?

首先:时区实际上并不在你提供的字符串中。它说+02:00告诉你GMT的偏差。它没有告诉你时区。例如。现在+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]);

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