【问题标题】:How can I convert a NSString that contains timezone info to NSDate?如何将包含时区信息的 NSString 转换为 NSDate?
【发布时间】:2016-11-27 04:26:08
【问题描述】:

我从 Web 服务接收 JSON 数据,其中日期为字符串格式,包括时区格式,如下所示:

{
        currencyName = EUR;
        itemID = 101064027138011;
        price = "6.95";
        priceIncTAX = 1;
        validFromDate = "2016-11-03T00:00:00";
        validToDate = "2020-01-01T00:00:00";
}

当我尝试将包含时区的字符串转换为 NSDate 时,返回值始终为 nil/null,如果我手动发送没有时区信息的字符串,例如 @"2016-11-03",则转换工作正常但结果日期包括时区偏移等,不符合我的 dateFormatter

我使用下面的代码来展示手头的挑战

NSString *validTo = @"2016-11-03";
NSString *validFrom = @"2020-11-03T00:00:00";

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"YYYY-MM-dd"];
NSDate *validToDate = [dateFormat dateFromString:validTo];
NSDate *validFromDate = [dateFormat dateFromString:validFrom];

if([NWTillHelper isDebug] == 1) {
    NSLog(@"WebServices:fetchPriceList:validToDate: >>>> %@ <<<<", validToDate);
    NSLog(@"WebServices:fetchPriceList:validFromDate: %@", validFromDate);
}

调试告诉我,没有 tz 信息的字符串可以正常工作(除了不遵守我的 dateFormatter),但有 tz 信息的字符串不能。

如何将包含 tz 信息的字符串转换为 NSDate 以及为什么当我发送没有时区信息的字符串时它不遵守我的 dateFormatter。

016-11-27 12:09:22.194 NWMobileTill[4275:235671] WebServices:fetchPriceList:validToDate: >>>> 2016-11-02 16:00:00 +0000 <<<<
2016-11-27 12:09:22.194 NWMobileTill[4275:235671] WebServices:fetchPriceList:validFromDate: (null)

【问题讨论】:

  • 您的 JSON 日期字符串中没有时区信息。
  • 你真的认为YYYY-MM-dd这个格式真的匹配了2020-11-03T00:00:00这个字符串吗?他们需要匹配。并且不要使用YYYY,使用yyyy 一年。

标签: ios nsdateformatter


【解决方案1】:

从此更改您的日期格式化程序

[dateFormat setDateFormat:@"YYYY-MM-dd"];

到这里

[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];

由于您从服务器获取的格式不同,并且在您的代码中使用不同的日期格式

编辑

正如@rmaddy 在他的评论中提到的那样,您没有在从服务器获取的日期字符串中获取时区,并且日期格式化程序会根据用户当前的时区将您的字符串转换为日期。

作为一个建议,我想向您提一下,您的日期字符串必须包含时区以及类似这样的内容

2016-11-27T10:39:57-05:30

此字符串包含 IST 时区和您的日期格式化程序

[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];

您将根据日期字符串的时区获取日期,而不是根据用户的区域设置。

【讨论】:

  • 是的,Rajat 是对的。您需要将格式更改为 yyyy-MM-dd'T'HH:mm:ss
  • 日期字符串中没有时区信息的事实(这很糟糕)带来了另一个问题。应该使用什么时区来解析这些日期字符串?默认情况下,这些将被视为用户区域时间中的日期,这不太可能是正确的,因为它们来自某个服务器。
  • 是的,我完全同意@rmaddy 的观点,字符串中没有时区,它将根据用户的本地时区进行转换
  • 我可能误解了 dateFormatter 的使用,我认为我可以从字符串转换并同时将日期格式从例如 yyyy-MM-dd 更改为 yy--MM-dd或者我需要什么?你是说在转换中我需要它们完全匹配才能使转换工作,但是我应用另一个 dateFormatter 将实际格式更改为我需要的格式?
  • 是的,如果您想根据需要更改日期,则必须更改 dateformatter 格式,获取日期后,根据您的要求更改日期格式
猜你喜欢
  • 2016-09-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2011-04-24
  • 2017-04-23
相关资源
最近更新 更多