2010-02-01 59 views
24

我有問題。我以12小時格式獲得傳入時間字符串,並將它們轉換爲NSDate對象。當iPhone處於12小時制格式時,沒有問題。但是當它是24小時制時,事情就會出錯。下面是一些示例代碼來演示:NSDateFormatter dateFromString和iPhone在24小時格式混亂

NSString *theTime = @"3:19 PM"; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"h:mm a"]; // "3:19 PM" 
NSDate *date = [formatter dateFromString:theTime]; 
NSString *theString = [formatter stringFromDate:date]; 

民國24小時模式,日期是1970-01-01三點19分00秒,並theString是 「3:19」 - 錯誤

12小時模式,日期是1970-01-01 15點19分00秒,並theString是「下午三時19分」 - 右

所以......問題1:爲什麼是設備的24小時設置覆蓋我的日期格式化設置?

更重要的是,問題2:如何獲得從12小時到24小時的正確轉換?

我已經有了檢測手機是否處於24小時模式的代碼,但除了在字符串中挖掘並用15交換3以外,似乎沒有一種乾淨的方式來執行此操作。

回答

28

不知道你是否仍然需要它,但我有類似的問題,通過設置日期格式化程序的區域設置得到解決。也就是說,如果你想強制它進入12小時模式,不管用戶的24/12小時模式設置如何,你應該把語言環境設置爲en_US_POSIX。

+0

這個答案在我選擇了另一條路線後很久了,但這聽起來很合理,而其他人已經驗證過了,所以我會將其標記爲已回答。 – Silromen

+0

它是如何爲你工作的..我沒有得到12小時的設置。 – Hisenberg

+0

非常感謝!!!!它現在可以工作.... – harshit2811

6

我相信@「h:mm a」應該是@「HH:mm a」。

如果您在可可中使用預構建的dateformatter,一切都將爲您照顧。

NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[timeFormatter setTimeStyle:NSDateFormatterShortStyle]; 
[timeFormatter setDateStyle:NSDateFormatterNoStyle]; 

NSDateFormatterShortStyleNSDateFormatterNoStyle有不同的品種。 使用這些將確保您尊重用戶爲日期和時間選擇的設置。

如果你有一個模型或一些價值對象來存儲你的日期,12-14小時時鐘轉換是由SDK照顧的,儘量保持它們爲NSDate。這樣,只有在需要顯示它們時纔可以格式化它們。將字符串保存爲字符串可能會打開一個麻煩的世界,當您可以從單獨指定GMT的xml中解析它們或嘗試添加和減去NSTimeIntervals時。

+0

謝謝。我用這個代碼給了它一個旋轉: NSString * theTime = @「3:19 PM」; NSDateFormatter * timeFormatter = [[[NSDateFormatter alloc] init] autorelease]; [timeFormatter setTimeStyle:NSDateFormatterShortStyle]; [timeFormatter setDateStyle:NSDateFormatterNoStyle]; NSDate * date = [timeFormatter dateFromString:theTime]; NSString * theString = [timeFormatter stringFromDate:date]; 日期爲零。當我嘗試這條路線時,我遇到了這個問題,但它不起作用。非常令人沮喪。 – Silromen

1

好吧,給我留下了評論,但它一起壓扁所有的代碼,所以我必須「回答」我有意見的問題:

感謝。我用這個代碼給了它一個旋轉:

NSString *theTime = @"3:19 PM"; 
NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];  
[timeFormatter setTimeStyle:NSDateFormatterShortStyle]; 
[timeFormatter setDateStyle:NSDateFormatterNoStyle]; 
NSDate *date = [timeFormatter dateFromString:theTime]; 
NSString *theString = [timeFormatter stringFromDate:date]; 

而且日期來了nil。當我嘗試這條路線時,我遇到了這個問題,但它不起作用。非常令人沮喪。

+0

嗨Silromen。該方法僅用於顯示日期和時間。要從字符串建立日期,您需要應用正確的格式。正如你在這裏所做的那樣:[formatter setDateFormat:@「h:mm a」]; //「3:19 PM」但注意HH而不是HH。 – RickiG

+0

感謝您的回覆,但這只是不起作用。在24小時模式下的iPhone上,3:54 PM依然以03:54:00的日期對象形式出現,並且在模擬器中(我的電腦時鐘處於24小時模式),情況更糟:12:54:00。 – Silromen

13

這樣做的原因行爲是區域設置,設置正確的語言環境

 
    NSString *strAgendaDate = @"01/17/2012 12:00 AM"; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 

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

    [dateFormatter setDateFormat:AgendaDateFormatForMeeting]; 
    NSDate *meetingDate = [dateFormatter dateFromString:aStrDate]; 
    [dateFormatter setDateFormat:AgendaDateRepresentation]; 
    strAgendaDate = [dateFormatter stringFromDate:meetingDate]; 

它同時適用於24小時和12小時格式

+1

謝謝@Meet,這是瘋狂的如何一條線的代碼可以改變一切:) – DrPatience

+0

謝謝@Meet,它的工作。 –

6

我從改爲@ 「HH:MM:SS」@「HH:mm:ss」,時間風格從「1:03 PM」改變爲「13:03」。 希望這會幫助你。