2011-05-04 50 views
4

的問題,我有這樣的代碼:IOS:與NSDate的

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease]; 
[components setYear:2011]; 
[components setDay:1]; 
[components setMonth:4]; 
NSCalendar *gregorianCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 
NSDate *firstDate = [gregorianCalendar dateFromComponents:components]; 
NSLog(@"date:%@", firstDate); 

結果在控制檯:

date:2011-03-31 

爲什麼????如果我設置「setDay:1」,它會是「日期:2011-04-01」,不是?

+2

這不是「NSLog」調用的完整結果。它應該看起來像這樣:'2011-05-04 17:45:48.698 DatePrint [55569:a0b]日期:2011-04-01 00:00:00 -0000',即日期將打印時間和時區。運行代碼時,我會得到預期的結果。請發佈您的日誌的完整輸出。 – 2011-05-04 17:50:30

+0

2011-05-05 09:23:29.268 Project1 [92:707]日期:2011-04-30 22:00:00 +0000 .....我設定了2011年,第5天和第1天。 – CrazyDev 2011-05-05 07:25:58

+0

看起來像它可能是一個時區/「夏令時間」的差異。 – 2011-05-05 17:00:14

回答

2

我認爲這可能是一個時區相關的問題。一定要設置時區上NSDateComponents:

[ components setTimeZone:[ NSTimeZone systemTimeZone ] ] ; 
+0

我嘗試,它不工作... – CrazyDev 2011-05-04 17:31:27

+0

我解決[組件setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:(+ 0 * 3600)]]; – CrazyDev 2011-05-05 17:35:41

+2

我認爲這可能會在稍後造成麻煩。當您從2011年1月4日創建日期時,這是當前時區的午夜。但是,當打印日期時,他們會在格林威治標準時打印您的日期。這就是爲什麼有差異。除非您的日期/時間計算錯誤,否則您可能會堅持使用'[NSTimeZone systemTimeZone]'(或根本沒有) – nielsbot 2011-05-05 17:42:55

0

嘗試:

[components setWeekdayOrdinal:1]; // The first day in the month 

從NSDateComponents文檔:

可以配置NSDateComponents的一個實例指定的組件日期,然後使用NSCalendar方法dateFromComponents:創建相應的日期對象。您可以根據需要提供儘可能多的組件(或選擇)。當有不完整的信息來計算絕對時間時,默認值(如0和1)通常由日曆選擇,但這是特定於日曆的選擇。如果您提供的信息不一致,則執行日曆專用的消歧(可能涉及忽略一個或多個參數)。

+0

不,我嘗試你的代碼,但它不起作用 – CrazyDev 2011-05-05 07:36:23

+0

2件事情:嘗試一些不同的數字(除了日子== 1),如15,所以也許你可以確定發生了什麼事情,並且還將整個NSLog行作爲@Josh Caswell指出。 – Rayfleck 2011-05-05 12:26:33

1

另外它取決於日期格式。我的日期爲YYYY 1歲,我將其更改爲yyyy(小寫),然後修復。小心一點。