2012-03-23 63 views
0

我有這樣一段代碼:目標c - NSDateFormatter返回錯誤的日期

// Convert string to date object 
     NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
     [dateFormat setDateFormat:@"MMMM d, YYYY"]; 
     NSDate *formatDate = [dateFormat dateFromString:self.date]; 
     NSLog(@"1-%@", self.date); 
     NSLog(@"2-%@", formatDate); 
     NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:formatDate]; 
     NSString *dateCal = [NSString stringWithFormat:@"%d/%d/%d", [components day], [components month], [components year]]; 
     NSLog(@"3-%@", dateCal); 
     milage.date = dateCal; 

第一的NSLog返回:

1-2012年3月23日

第二種:

2-2011-12-25 00:00:00 +0000

第三個:

3-25/12/2011

爲什麼從字符串獲取日期並格式化日期時會發生變化?我期待第三次NSLog(或dateCal)等於23/3/2012。我住在英國所以它不是做的時區..

感謝,

傑克

+1

我很驚訝,你看 「2012年3月23日,」 當你的NSLog self.date。在我的機器上,NSLog(@「%@」,[NSDate date]);產生一個像「2012-03-23 14:47:48 +0000」的日期。 – danh 2012-03-23 14:50:13

+2

謝謝,只需要使用'yyyy'代替。 – 2012-03-23 14:51:25

+0

這是一個測試,看看這個條件是否成立[self.date timeIntervalSinceReferenceDate] == [formatDate timeIntervalSinceReferenceDate]。 (醜陋的格式,很抱歉,但由於這不是一個真正的答案,我想它應該是一個評論)。 – danh 2012-03-23 14:52:34

回答

3

需要行使用小寫字母 'Y':

[dateFormat setDateFormat:@"MMMM d, YYYY"]; 
+0

爲什麼大寫'YYYY'會導致錯誤的一年? – 2014-09-03 15:37:21

2

你使用的setLocale方法是什麼?

此外,從技術答疑&答:

如果您正在使用用戶可見的日工作時,應避免設置一個日期格式字符串,因爲它是很難預測你的格式字符串將如何以所有可能的用戶配置表示。相反,您應該嘗試限制自己設置日期和時間樣式(通過 - [NSDateFormatter setDateStyle:]和 - [NSDateFormatter setTimeStyle:])。

0

使用[dateFormat setDateStyle:NSDateFormatterLongStyle];
而不是[dateFormat setDateFormat:@"MMMM d, YYYY"];
會給你,只要我找到它的理由。