为什么我的格式化器返回nil NSDate



下面的代码将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尝试了许多其他不同的变化,但似乎无法得到它。我也有点困惑,什么时候和在哪里使用单引号。在使用了一段时间后,我假设它可以绕过不应该由格式化器解释的字符,但这是另一回事。

相关链接,不能帮助我:

  1. Apple Docs: Data Formatting guide
  2. 为什么NSDateFormatter返回nil?

我尝试过的格式:

NSString *UTC_FORMAT = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'";
NSString *UTC_FORMAT = @"yyyy-MM-dd'T'HH:mm:ss-Z";

您的日期看起来像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];
}

要避免依赖于当前区域设置,请添加:

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];

最新更新