如何将包含时区信息的 NSString 转换为 NSDate?
How can I convert a NSString that contains timezone info to NSDate?
我正在从 Web 服务接收 JSON 数据,其中日期为字符串格式并包含时区格式,如下所示:
{
currencyName = EUR;
itemID = 101064027138011;
price = "6.95";
priceIncTAX = 1;
validFromDate = "2016-11-03T00:00:00";
validToDate = "2020-01-01T00:00:00";
}
当我尝试将包含时区的字符串转换为 NSDate 时,return 值始终为 nil/null,如果我手动发送不带时区信息的字符串 i,e @"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)
从此更改您的日期格式
[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"];
您将根据日期字符串的时区获取日期,而不是根据用户的区域设置。
我正在从 Web 服务接收 JSON 数据,其中日期为字符串格式并包含时区格式,如下所示:
{
currencyName = EUR;
itemID = 101064027138011;
price = "6.95";
priceIncTAX = 1;
validFromDate = "2016-11-03T00:00:00";
validToDate = "2020-01-01T00:00:00";
}
当我尝试将包含时区的字符串转换为 NSDate 时,return 值始终为 nil/null,如果我手动发送不带时区信息的字符串 i,e @"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)
从此更改您的日期格式
[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"];
您将根据日期字符串的时区获取日期,而不是根据用户的区域设置。