2011-10-24 68 views
0

這筆交易我想1978年六月18日的的NSDate表示 我試圖初始化的NSDate像用的NSDate,格式和時區掙扎

dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
self.dateFormatter.timeStyle = NSDateFormatterNoStyle; 
self.startDate = [dateFormatter dateFromString:@"19/06/78"]; 
NSLog(@"%@", self.startDate); 

這將產生正確的日期時,iPhone是在國際設置中設置爲丹麥語。 它不適用於設置爲英語/美式設置的iPhone。

注意額外的一天(19),因爲丹麥是在GMT + 1,我認爲NSDate默認爲時間23:00:00。這表明我沒有按照預期工作。

我希望上述日期(18/06/1978)代表NSDate對象,無論設備上的時區,區域設置和國際設置如何。

如何實現這一目標?

編輯:

所以奧萊Begemann的答案似乎解決我的問題。他的解決方案確實在美國國際設置和歐洲國際設置的設備上創建了正確的日期。 但是,當蘋果應該審查的應用程序創建日期是1978年6月17日。這使得sence,因爲我將時區設置爲格林威治標準時間+0000。庫比蒂諾就像GMT -0007左右。 所以這會提前一天。

所以糾正我的問題:我要18-06-1978無論該設備是什麼樣的語言環境,時區物理或設置,逐

我試圖做的是設置一個起始日期18。 。1978年6月和稍後在我的應用程序中,將日期呈現爲格式爲「780618」(yyMMdd)的字符串,而不考慮設備的時區或地點。它總是必須是「780618」,因爲這是我的應用程序的關鍵開始日期。

所以我可能會出錯的問題。我可能應該接受時區的東西,並嘗試配置NSDateFormatter以輸出正確的日期,而不是試圖在任何地方強制使用相同的日期。

所以基本上:我想要的是任何地方格式化爲「780618」的NSDate實例 - 在任何時區使用任何國際設備設置。

如何實現這一目標?

回答

3

我希望上述日期(18/06/1978)代表NSDate對象,無論設備上的時區,區域設置和國際設置如何。

這對NSDate沒有任何意義。一個NSDate總是代表一個時間點,所以根據定義它包括一個時間和這個時間所在的時區(或者更確切地說,它以GMT來存儲時間;時間只轉換爲另一個時區來顯示目的)。如果你只想要日期,你必須對時間做出自己的定義,例如以格林尼治標準時間午夜時間存儲這些日期。

以編程方式設置日期時,必須始終設置時區,如果使用日期格式化程序,請設置格式化程序的區域設置和日曆。這可確保您的代碼獨立於用戶/設備的區域設置。

我會做這樣的:

NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 
[dateComponents setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
[dateComponents setYear:1978]; 
[dateComponents setMonth:6]; 
[dateComponents setDay:18]; 
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *date = [calendar dateFromComponents:dateComponents]; 
NSLog(@"%@", date); 
+0

工作就像一個魅力。嘗試了其他的答案,但沒有奏效。要麼保持不變,要麼NSDate默認爲2001年1月1日。(DateFormatter返回的結果無我相信)。謝謝你的想法。 – esbenr

+0

或者我想。我的應用被Apple拒絕,因爲沒有內容。 (該應用程序使用日期來獲取內容。)我根據蘋果的回覆編輯了我的問題。 – esbenr

+0

我很確定我不瞭解NSDate。所以我的問題可能是我沒有在我的所有日​​歷格式化器上設置時區?我會嘗試將所有格式化程序設置爲GMT。但我如何驗證它的工作原理?在模擬器上設置時區是不可能的。我如何「模擬」從另一個時區測試應用程序? – esbenr

0

你可以這樣做:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 

// Set the locale to en_US_POSIX. This makes the date formatter respect 
// the format string regardless of the user's locale. 
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
[formatter setLocale:locale]; 
[locale release]; 

// We want the date in the user's current time zone. 
[formatter setTimeZone:[NSTimeZone localTimeZone]]; 

[formatter setDateFormat:@"dd/MM/yy"]; 

NSDate *date = [formatter dateFromString:@"18/06/78"]; 

[formatter release]; 

NSLog(@"%@", date); 

所顯示的日期這樣1978-06-17 23:00:00 +0000是因爲的NSDate的描述返回GMT的日期。 1978年6月17日23:00是1978年6月18日00:00 GMT + 1。

+0

你的建議,使dateformatter回零;但是你對NSDate描述的解釋是合理的。 – esbenr

+0

@Morten:我不解釋NSDate爲「因爲NSDate的描述以GMT返回日期」。我在本地更正了仍然顯示+0000的日期。所以,實際上,這只是一小撮垃圾。 NSDate沒有時區是很多人重複的用詞不當。鑑於描述顯示它,它具有它。蘋果可以通過允許我們這樣做編碼世界一項巨大的服務,我們都可以恢復工作: NSDate * localDate = [NSDate localDate]或 NSDate * localDate = [myUTCDate localDate] .. 並看到這:(lldb)po myLocalDate 2015-05-02 16:44:53 -0800 (lldb) –