dateFromString始终使用dateformatter返回null

时间:2011-04-12 16:17:17

标签: iphone objective-c

我有以下代码:

 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 个答案:

答案 0 :(得分:29)

如果设备设置为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"];

答案 1 :(得分:18)

你是在后台线程中这样做的吗?我没有在ui-thread中使用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;
}

答案 2 :(得分:8)

我有同样的问题。我开始通过使用this resource仔细检查用于转换的字符串是否有效。

然后我想到它可能是语言环境,所以我尝试了以下内容:

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

它就像一个魅力。希望这会有所帮助。

答案 3 :(得分: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);

输出结果为:date:2011-04-12 17:00:00 +0000

答案 4 :(得分:4)

是的,同意@Jan Gressmann,这太奇怪了!我也在非ui线程上使用NSDateFormatter,而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

这真的很奇怪......

答案 5 :(得分:3)

我遇到了与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];

答案 6 :(得分:3)

dateFromString stringFromDate 返回 null ,因为设备时间格式(例如:12小时或24小时)和< strong>设备时区

将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;
}

答案 7 :(得分:0)

尝试在转换(日期到字符串)和(字符串到日期)时以相同的格式设置两个日期格式化程序。以下格式

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

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

答案 8 :(得分:0)

我有类似的问题,dateFromString:在ios模拟器中取得成功,而在iPhone中,它总是返回NULL,在我添加下面带有dateFormatter的代码后,它成功了在iPhone广告模拟器中:

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

答案 9 :(得分:0)

您可以使用此格式"yyyy-MM-dd hh:mm:ss"

在iOS10上使用swift2.3时,关键是使用内嵌hh而不是HH来格式化小时

希望这可能有用。