DateFromString всегда возвращает null с 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"];
В котором он всегда генерирует нулевую дату. Почему это?
Ответы
Ответ 1
Вы делаете это в фоновом потоке? У меня был странный опыт работы с NSDateFormatter, когда он не использовался в ui-thread. В любом случае, здесь метод, который я использую, должен работать для вас:
+ (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;
}
Ответ 2
Если для устройства установлено время 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"];
Ответ 3
У меня была такая же проблема. Я начал с двойной проверки того, что строка, используемая для преобразования, была действительной, используя этот ресурс.
Тогда я подумал, что это может быть локаль, поэтому я попробовал следующее:
[dateFomatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_AU"]]
Он работал как шарм. Надеюсь, это поможет.
Ответ 4
Я только что запустил этот код, и это сработало для меня.
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
Ответ 5
Да, согласился с @Jan Gressmann, это так странно! Я также использую NSDateFormatter для потока non-ui, а селектор dateFromString иногда возвращает null... Например, у меня есть этот код:
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
Это действительно странно...
Ответ 6
У меня возникла аналогичная проблема с 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];
Ответ 7
dateFromString и stringFromDate возвращает null из-за формата устройства (например: 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;
}
Ответ 8
Попробуйте установить оба форматирования даты в том же формате при преобразовании (дата в строку) и (строка в дату). В следующем формате
[formatter1 setDateFormat:@"MM/dd/yyyy hh:mm:ss a"]
[formatter2 setDateFormat:@"MM/dd/yyyy hh:mm:ss a"]
Ответ 9
У меня есть аналогичная проблема с вами, dateFromString:
успех в симуляторе ios, в то время как в iPhone он всегда возвращает NULL
, после добавления кода ниже, связанного с dateFormatter
, это успех в симуляторе iPhone:/p >
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
Ответ 10
Вы можете использовать этот формат "yyyy-MM-dd hh:mm:ss"
.
Ключ использует уменьшенный hh
вместо hh
для форматирования часа, когда вы используете swift2.3 на iOS10
Надеюсь, что это может быть полезно.