2011-04-12 128 views
14

我有以下代碼: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"]; 

在它總是產生一個空日期。爲什麼是這樣?

+4

看起來像昨天你問的同樣的問題,但簡化了。你應該修改原來的問題。我們有些人花了很多時間來幫助你。 http://stackoverflow.com/questions/5628062/memory-management-and-global-variable/5628202#5628202 – XJones 2011-04-12 16:25:31

回答

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; 
} 
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十七時00分00秒0000

+0

你忘了:NSDate * theDate = – NWCoder 2011-04-12 16:25:03

0

嘗試設置在相同的格式兩個日期格式化器而轉換(日期字符串)和(串在以下格式

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

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

是的,贊同@Jan Gressmann,這是如此的奇怪!我現在用的是NSDateFormatter非UI線程,以及,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 

這真是奇怪...

8

我有同樣的問題。我開始時通過使用this resource仔細檢查用於轉換的字符串是否有效。

然後我有一個想法,這可能是語言環境,所以我嘗試了以下內容:

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

它的工作就像一個魅力。希望這可以幫助。

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"]; 
+0

即使做一個檢查,並設置格式爲「hh:mm a 「不起作用。這樣做。謝謝! – Jasper 2014-04-01 15:19:33

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]; 
+1

縮寫「UTC」的設置時區幫助了我。謝謝 – Vladimir 2015-04-27 14:54:22

0

我有跟你類似的問題,在iPhone模擬器dateFromString:成功,而在iPhone ,它總是返回NULL,之後我加入附有dateFormatter下面的代碼,它在iPhone廣告模擬器成功:

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

dateFromStringstringFromDate返回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; 
} 
0

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

的關鍵是使用downcased hh而不是HH當您使用swift2.3上iOS10

希望這可能是有用的格式化小時