NSDateFormatter возвращает ноль для даты 13 января 2020 года 05:22:03 -0800 - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь форматировать даты электронной почты, но форматер даты возвращает ноль, где последние пять символов -0800. Нет проблем с датой +0000. У меня есть список смешанных дат писем, заканчивающихся на +0000 и -0800

. Как мне добавить разницу в 8 часов к дате, чтобы она стала +0000? Некоторые письма отправлены из Лос-Анджелеса с датой происхождения 13 января 2020 года 05:22:03 -0800. Но я въезжаю в Великобританию с разницей в 8 часов.

13 января 2020 г. 05:22:03 -0800 должно выглядеть примерно 13 января 2020 г. 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;
}

13 января 2020 г. 05:22:03 -0800 is указанная c дата возвращает ноль. Любая помощь оценивается.

Я попробовал ниже заявления

[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 голосов
/ 14 января 2020

Строка даты не содержит дня недели, поэтому спецификатор 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

...