【问题标题】:extract NSTimeZone from string like '+-hh:mm'从字符串中提取 NSTimeZone,例如 '+-hh:mm'
【发布时间】:2015-09-26 06:55:02
【问题描述】:

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

提前致谢!

【问题讨论】:

  • 对,数据是天气数据,例如德国 +02:00。如果我切换到伦敦,本地日期是 +01:00。
  • 是的,我想用 UTC 计算,但以当地时间显示,所以它是分开的。我会尝试解析字符串,谢谢。
  • 在您假设的parseFromString 方法中,您认为哪个答案是正确的?
  • 正确的是一个或多个 UTC+02:00 时区对象

标签: ios nsdate nsdateformatter nstimezone


【解决方案1】:

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

首先:时区实际上不在您提供的字符串中。它说 +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]);

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

【讨论】:

  • 感谢您的帮助,除了可以有 -+ 外,此方法有效,但我只是将其添加到 if 语句中 :) 我会问我的同事谁在 API 上工作添加带有偏移量的 JSON 条目以使解析更容易。
猜你喜欢
  • 1970-01-01
  • 2011-06-14
  • 2016-11-05
  • 2012-03-03
  • 2020-11-20
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多