dateFromString всегда возвращает ноль с dateformatter

У меня есть следующий код:

 NSDateFormatter * df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    [df setTimeZone:[NSTimeZone systemTimeZone]];
    [df setFormatterBehavior:NSDateFormatterBehaviorDefault];

    [df dateFromString:@"2011-04-12 10:00:00"];

В котором он всегда генерирует нулевую дату. Почему это?

10 ответов

Решение

Вы делаете это в фоновом потоке? У меня был странный опыт работы с NSDateFormatter, когда он не использовался в потоке пользовательского интерфейса. Во всяком случае, вот метод, который я использую, должен работать для вас:

+ (NSDate*)parseDate:(NSString*)inStrDate format:(NSString*)inFormat {
    NSDateFormatter* dtFormatter = [[NSDateFormatter alloc] init];
    [dtFormatter setLocale:[NSLocale systemLocale]];
    [dtFormatter setDateFormat:inFormat];
    NSDate* dateOutput = [dtFormatter dateFromString:inStrDate];
    [dtFormatter release];
    return dateOutput;
}

Если для устройства установлено время AM/PM, а требуемый формат строки установлен на @"yyyy-MM-dd HH:mm:ss"dateFromString вернусь nil,

Если вы установите язык на @"en_US" Конверсия вернет правильную дату.

dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
[dateFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *date = [dateFormat dateFromString:@"2013-02-14 09:30:00"];

Я была такая же проблема. Я начал с двойной проверки, что строка, используемая для преобразования, была действительной с использованием этого ресурса.

Затем я подумал, что это может быть локаль, поэтому я попробовал следующее:

[dateFomatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_AU"]]

Оно работало завораживающе. Надеюсь это поможет.

Я просто запустил этот код, и он работал для меня.

NSDateFormatter * df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[df setTimeZone:[NSTimeZone systemTimeZone]];
[df setFormatterBehavior:NSDateFormatterBehaviorDefault];

NSDate *theDate = [df dateFromString:@"2011-04-12 10:00:00"];
NSLog(@"date: %@", theDate);

Вывод был: дата: 2011-04-12 17:00:00 +0000

Да, согласился с @Jan Gressmann, это так странно! Я использую NSDateFormatter для не-пользовательского потока, а селектор dateFromString иногда возвращает ноль... Например, у меня есть этот код:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[dateFormat setLocale:usLocale];
[dateFormat setDateFormat:@"dd MMM yy HH:mm:ss"];
NSDate *startDate = [dateFormat dateFromString:str_StartDate];
NSDate *endDate = [dateFormat dateFromString:str_endDate];

Вывод в консоль:

(lldb) po str_StartDate
(NSString *) $7 = 0x06da2180 03 SEP 2012 10:00:00
(lldb) po str_endDate
(NSString *) $8 = 0x06d3a810 08 SEP 2013 10:00:00
(lldb) po startDate
(NSDate *) $9 = 0x00000000 <nil>
(lldb) po endDate
(NSDate *) $10 = 0x06db05b0 2013-09-08 02:00:00 +0000

Это действительно странно...

dateFromString и stringFromDate возвращают ноль из-за формата времени устройства (например: 12 или 24 часа) и часового пояса устройства

Преобразовать 12 часов в 24 часа

- (NSString*)getTimeIn24Hr:(NSString*)time12hrWithDate
{
    NSDateFormatter* df12 = [[NSDateFormatter alloc] init];
    [df12 setTimeZone:[NSTimeZone systemTimeZone]];
    [df12 setDateFormat:@"yyyy-MM-dd hh:mm a"];
    NSDate* dateTime12hr = [df12 dateFromString:time12hrWithDate];

    NSDateFormatter *df24 = [[NSDateFormatter alloc]init];
    [df24 setLocale:[NSLocale systemLocale]];
    [df24 setDateFormat:@"HH:mm:ss"];
    NSString * time24HrOutput = [df24 stringFromDate:dateTime12hr];

    return time24HrOutput;
}

Конвертировать 24 часа в 12 часов

- (NSString*)getTimeIn12Hr:(NSString*)time24hrWithDate
{
    NSDateFormatter* df24 = [[NSDateFormatter alloc] init];
    [df24 setLocale:[NSLocale systemLocale]];
    [df24 setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate* dateTime24hr = [df24 dateFromString:time24hrWithDate];

    NSDateFormatter *df12 = [[NSDateFormatter alloc]init];
    [df12 setDateFormat:@"hh:mm a"];
    NSString * time12HrOutput = [df12 stringFromDate:dateTime24hr];

    return time12HrOutput;
}

У меня была похожая проблема с iOS8 (XCode 6), я сделал следующие изменения в NSDateFormatter -

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDate *formattedDate = [dateFormatter dateFromString:dateString];

У меня похожая проблема с тобой, dateFromString: успех в симуляторе ios, а в iPhone всегда возвращается NULLпосле того, как я добавлю нижеприведенный код с dateFormatterУспех в симуляторе рекламы iPhone:

[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];

Попробуйте установить оба средства форматирования даты в одном и том же формате во время преобразования (дата в строку) и (строка в дату). В следующем формате

[formatter1 setDateFormat:@"MM/dd/yyyy hh:mm:ss a"]

[formatter2 setDateFormat:@"MM/dd/yyyy hh:mm:ss a"]

Вы можете использовать этот формат "yyyy-MM-dd hh:mm:ss",

Ключ используется в нижнем регистре hh скорее, чем HH отформатировать час при использовании swift2.3 на iOS10

Надеюсь, что это может быть полезно.

Другие вопросы по тегам