2011-07-06 61 views
5

我的應用程序使用[NSDate date]函數獲取當前日期。除了AM期間每個月的第一天外,其他日子的工作情況良好。即跟隨以下步驟:NSDate在第一天返回錯誤的日期

  1. 將系統日期設置爲01 - 2011年6月&時間從午夜00.00到午夜5.59之間。
  2. 使用下面的代碼:
    NSLog(@"Current Date :: %@",[NSDate date]);

的O/P是::當前日期:: 2011-05-31 19點40分21秒+0000

期望中的O/P是::當前日期:: 2011-06-01 00:00:0(即時間設定)+0000

也從上午6點它工作正常。

這是什麼原因?

其實我不想NSDate字符串格式,但我想要的是NSDate日期對象對應於當前月份的第一個日期。我使用以下代碼片段:

NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar]; 
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 

NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit 
| NSDayCalendarUnit) fromDate:[NSDatedate]]; 

[comp setDay:1];  

NSDate *firstDayOfMonthDate = [gregorian dateFromComponents:comp]; 

[gregorian release]; 

return firstDayOfMonthDate; 

由於[NSDate date]返回錯誤的日期,組件也包含錯誤的日期。上面的代碼適用於所有senario,除了我在本主題開頭髮布的senario之外。我該怎麼辦?

+0

鑑於此信息,我想不出爲什麼它應該是這樣的原因。也許它是一個錯誤? –

回答

0

您正在運行iOS 4.2版本?如果是這樣,日期方法有一些問題,它似乎並不尊重你的本地時區。例如,如果我運行了iOS 4.0模擬器你的代碼,我得到這樣的輸出:

Current Date :: 2011-07-06 10:43:38 -0400

但是,如果我在的iOS 4.2模擬器上運行它,我得到這個:

Current Date :: 2011-07-06 14:44:18 +0000

這裏是另一個SO職位描述得更詳細:

NSDate et al woes on iOS 4.2

如果你只是尋找當前日期和時間在一個NSString,我使用的代碼看起來像這樣來完成這一任務:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setFormatterBehavior:NSDateFormatterBehavior10_4]; 
[formatter setDateStyle:NSDateFormatterShortStyle]; 
[formatter setTimeStyle:NSDateFormatterShortStyle]; 
NSString *result = [formatter stringFromDate:[NSDate date]]; 
[formatter release]; 
NSLog(@"Current Date v2 :: %@",result); 
+0

但我想NSDate對象或NSDateComponents對象&不是一個字符串。我該怎麼辦? –

+0

等待回覆? –

2

終於得到了解決:

的一點是,的NSDate對象沒有與它們關聯的時區,並且在蘋果公司發佈的一些人發佈後,決定使用NSDate的-description方法,這是NSLog使用的方法,應該使用GMT + 0而不是本地時區輸出。 (我假設有人有一個錯誤,他們損壞了他們的語言環境設置,導致NSDate的描述方法崩潰,所以錯誤報告被提交......)

簡短版本:使用NSDateFormatter輸出日期。請勿使用-description

+0

...或子類NSDate並編寫自己的描述方法。 –

+0

這就是爲什麼描述中有「+0000」的原因。 – Sulthan

相關問題