NSDateFormatter返回日期为2020年1月13日05:22:03 -0800的nil

时间:2020-01-14 11:14:53

标签: objective-c nsdate nsdateformatter nslocale

我正在尝试合并电子邮件日期,但日期格式化程序返回nil,其中最后五个字符为-0800。日期为+0000没问题。我有以+0000和-0800结尾的电子邮件的混合日期列表

我该如何在我的日期中加上8个小时的差值使其变为+0000?一些电子邮件从洛杉矶日期始发于2020年1月13日05:22:03 -0800。但是,我在英国的访问时间相差8小时。

2020年1月13日05:22:03 -0800应该看起来像2020年1月13日13:22:03 +0000

- (NSDate *) date
{
    NSString *d = [headers objectForKey:@"date"];
    if (d == NULL)
        return NULL;

    NSRange rng = [d rangeOfString:@" ("];
    if (rng.location != NSNotFound)
        d = [d substringToIndex:rng.location];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"] autorelease]];
    formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    [formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZ"];
    NSDate *result = [formatter dateFromString:d];
    [formatter release];

    return result;
}

2020年1月13日05:22:03 -0800是特定日期返回nil。任何帮助都可以申请。

我尝试了以下声明

[formatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]];
[formatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
[formatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"] autorelease]];
[formatter setLocale:[[NSLocale currentLocale] autorelease]];

[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss z"];
[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zz"];
[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzzz"];

[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];
[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZ"];
[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZZ"];

1 个答案:

答案 0 :(得分:0)

日期字符串不包含工作日,因此说明符EEE仍然是错误的。

将语言环境设置为en_US_POSIX,并使用格式dd MMM yyyy HH:mm:ss Z

顺便说一句,语法更短,更方便

formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];           
formatter.dateFormat = @"dd MMM yyyy HH:mm:ss Z";

您可以在unicode.org上找到格式说明符的完整列表

相关问题