我有以下代码:
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"];
它始终生成一个空日期。这是为什么?
答案 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)
将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
来格式化小时
希望这可能有用。