以下代码会将date
设置为nil。
NSString *dateString = @"2014-04-27T04:20:07.000-04:00";
NSString *UTC_FORMAT = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:UTC_FORMAT];
NSDate *date = [formatter dateFromString:dateString];
我做错了什么?
我已为UTC_FORMAT
尝试了许多其他不同的变体,但是似乎没有得到它。关于单引号的时间和地点,我也有点困惑。在玩了一段时间后,我假设它可以解决格式化程序不应该解释的字符,但这是一个单独的东西。
无法帮助我的相关链接:
我尝试过的格式:
NSString *UTC_FORMAT = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'";
NSString *UTC_FORMAT = @"yyyy-MM-dd'T'HH:mm:ss-Z";
答案 0 :(得分:1)
您的日期看起来像RFC3339格式的标准JSON日期格式。但是,如何格式化这些日期有几种可能性。在这种情况下,您的日期字符串包含毫秒。您的日期格式没有,因此无法使用。以下代码将首先检查没有小数秒的日期,然后检查小数秒的日期。此外,您正在寻找文字字符Z而不是时区。
“X5”记录于
http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns
以非常灵活的方式转换时区,包括中间的冒号。 .SSSSSS会将秒的小数部分转换为微秒。如果给你纳秒,则将其更改为9个S字符。
我忘记了语言区域信息......
NSString *UTC_FORMAT = @"yyyy'-'MM'-'dd'T'HH':'mm':'ssX5";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:UTC_FORMAT];
enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
gmtTimeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
[formatter setLocale:enUSPOSIXLocale];
[formatter setTimeZone:gmtTimeZone];
NSDate *date = [formatter dateFromString:dateString];
if (date == nil)
{
NSString *UTC_FORMAT2 = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSSSSX5";
NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];
[formatter2 setDateFormat:UTC_FORMAT2];
[formatter2 setLocale:enUSPOSIXLocale];
[formatter2 setTimeZone:gmtTimeZone];
date = [formatter2 dateFromString:dateString];
}
答案 1 :(得分:0)
要避免依赖当前区域设置,请添加:
NSString *dateString = @"2014-04-27T04:20:07.000-04:00";
NSString *UTC_FORMAT = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:UTC_FORMAT];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
NSDate *date = [formatter dateFromString:dateString];