NSDateFormatter returns 2020 年 1 月 13 日为零 05:22:03 -0800

NSDateFormatter returns nil for date 13 Jan 2020 05:22:03 -0800

我正在尝试格式化电子邮件日期,但日期格式化程序 returns 为零,其中最后五个字符为 -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为具体日期returns无。提供任何帮助。

我试过以下语句

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

日期字符串不包含工作日,所以说明符 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

上找到格式说明符的完整列表