2010-05-19 28 views
5
//NSString *compileDate = [NSString stringWithFormat:@"%s", __DATE__]; 
NSString *compileDate = [NSString stringWithUTF8String:__DATE__]; 

NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease]; 

[df setDateFormat:@"MMM d yyyy"]; 
//[df setDateFormat:@"MMM dd yyyy"];  

NSDate *aDate = [df dateFromString:compileDate]; 

好的,我放棄了。爲什麼aDate有時會返回爲零?iPhone SDK Objective-C __DATE__(編譯日期)無法轉換爲NSDate

如果我使用註釋行或其匹配的替換行,它應該是否重要?

+6

小記不值得回答:由於預處理器的工作方式,要將__DATE__作爲NSString,您可以簡單地寫@__DATE__ – 2010-07-09 01:28:07

回答

20

如果手機的區域設置不是美國(或等效),它可以返回零。

試試格式化的語言環境設置爲en_US:

NSString *compileDate = [NSString stringWithUTF8String:__DATE__]; 
NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease]; 
[df setDateFormat:@"MMM d yyyy"]; 
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
[df setLocale:usLocale]; 
[usLocale release]; 
NSDate *aDate = [df dateFromString:compileDate]; 
+0

哇。我會嘗試的。 我以爲__DATE__總會在編譯期間被確定...並且基於我正在編譯它的機器(英文)。 因此__DATE__將總是*爲「2010年2月1日」的格式。 (我沒有要求在運行時確定日期......或基於用戶的本地設置。) – Susanna 2010-05-20 18:18:13

+4

__DATE__'宏在編譯時確定,並用該格式的字符串文字替換。但是,將該字符串轉換爲NSDate會在受當前區域影響的運行時發生。 – DyingCactus 2010-05-20 21:46:31

9

稍微修改DyingCactus'答案ARC啓用(用於更容易的複印正粘貼)代碼:

NSString *compileDate = [NSString stringWithUTF8String:__DATE__]; 
NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MMM d yyyy"]; 
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
[df setLocale:usLocale]; 
NSDate *aDate = [df dateFromString:compileDate];