2013-02-28 92 views
48

'YYYY'和'yyyy'的區別是什麼?我在this link中讀到,它表示NSDateFormatter中'YYYY'和'yyyy'的區別

一個常見的錯誤是使用YYYY。 yyyy指定日曆年 ,而YYYY指定ISO 年曆中使用的年份(「年份周」)。在大多數情況下,yyyy和yyyy產生的數字相同,但它們可能不同。通常,您應該使用日曆年的 。

但是當我嘗試使用

NSString *stringDate = @"Feb 28, 2013 05:30pm"; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MMM dd, yyyy hh:mma"]; 
NSDate *date=[dateFormatter dateFromString:stringDate]; 
NSLog(@"Date 1 : %@",date); //2013-02-28 12:00:00 +0000 

NSString *stringDatee = @"Feb 28, 2013 05:30pm"; 
NSDateFormatter *dateFormatterr = [[NSDateFormatter alloc] init]; 
[dateFormatterr setDateFormat:@"MMM dd, YYYY hh:mma"]; 
NSDate *datee=[dateFormatterr dateFromString:stringDatee]; 
NSLog(@"Date 2 : %@",datee); //2013-01-05 12:00:00 +0000 

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"]; 
NSString *dateString = [dateFormat stringFromDate:datee]; 
NSLog(@"date 3 : %@", dateString); //Jan 05, 2013 05:30PM 

如這裏,結果到datedatee不同的,這是我的理解,但爲什麼之日起2和日期3的結果有什麼不同?由於我正在創建日期從字符串和反向重新字符串,但輸出不匹配?

有沒有人知道同樣的道理?雖然它規定了每年的一週,但我仍然應該得到相同的結果。

謝謝..

編輯: -

如果我的代碼

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"]; 
NSString *dateString = [dateFormatterr stringFromDate:[NSDate date]]; 
NSLog(@"date: %@", dateString); //Feb 28, 2013 04:37PM 

如果結果正確我的結果,但同時我作爲傳遞字符串到日期,我得到2013-01-05 12:00:00 +0000,檢查日期2 NSLog,奇怪的結果,爲什麼?

+1

每個人都應該看的WWDC 2011的視頻稱爲「會話117 - 執行日曆計算」,59:11,142.2 MB(HD)」,以獲取有關開明虛擬現實點菜星際迷航都能跟得上? 。我的意思是基於日曆的計算 - 什麼不是。如果你還沒有看過這個視頻,請觀看它,這是非常有趣的,如果你喜歡這樣的東西 – 2013-02-28 11:11:11

+0

@DigiMonk謝謝,我會看看它.. – 2013-02-28 11:12:04

+0

[ISO週日期](http://en.wikipedia.org/wiki/ISO_week_date) – 2013-02-28 11:35:26

回答

40

另外,當使用正確的格式使用日期格式字符串很重要。

@「YYYY」是以周爲基準的日曆年。

@「yyyy」是普通日曆年。

你可以通過整個博客,它是一個很好的給它一看

http://realmacsoftware.com/blog/working-with-date-and-time

+0

感謝您的回答,您是否檢查過我的日期2和日期3的NSLog?他們爲什麼不同?我通過相同的格式和相同的東西.. – 2013-02-28 10:54:07

+0

yyyy和YYYY之間的區別,我已經知道,完全檢查我的問題。 – 2013-02-28 10:55:38

+1

我希望它,因爲你正在將一個日期對象轉換爲一個字符串,這就是爲什麼它給2個不同的結果。 – 2013-02-28 10:59:11

16

一個常見的錯誤是使用 YYYY。 yyyy指定日曆年,而YYYY指定ISO年份周曆中使用的年度 (「年份周」)。在大多數 的情況下,yyyy和yyyy的產量相同,但它們可能與 不同。通常你應該使用日曆年。

Apple Docs

+2

你從我的問題粘貼相同的東西.. :)我想回答.. – 2013-02-28 10:55:11

+0

對不起,我的壞。一年有52周。這個值應該返回一年中的哪一週。這對計算財務項目或重複日曆事件很有用。 – 2013-02-28 11:02:38

+1

我同意這個標識符很混亂,並沒有很好的選擇。有標準的理由爲什麼它必須存在:https://en.wikipedia.org/wiki/ISO_week_date – 2013-02-28 11:05:03

2
dd/MMM/YYYY - e.g.:1 01/Jan/2000; answer : 19/dec/1999 
       (see weekly calendar December month last Monday 
       suppose leaf year + 1 day) 
dd/MMM/yyyy - eg: ordinary - no problem. 
+0

你能更形容你的答案嗎? – 2016-02-15 07:04:58

+0

僅查看每週日曆12月月份並查看星期一日期。 – 2016-02-19 06:47:51

0

所有答案區分yyyyYYYY是另外一個問題的正確答案。這個問題本身是指另一件事。

這兩個值爲什麼不同?(從問題中提取)

NSLog(@"Date 2 : %@",datee); //2013-01-05 12:00:00 +0000 
NSLog(@"Date 3 : %@", dateString); //Jan 05, 2013 05:30PM 

這裏@ P.J答案是,他們不是真正的價值不同。當你登錄一個NSDate(這是日期2),你會得到你的對象的完整描述恰好在UTC 時區。在記錄日期3時不會發生此邏輯,因爲它已被轉換爲字符串並應用了您的時區。

對於打印日期3「同樣的方式」爲你越來越日期2.您應指定UTC時區的日期3.事情是這樣的:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"]; 
[dateFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
NSString *dateString = [dateFormat stringFromDate:datee]; 
NSLog(@"date 3 : %@", dateString); 

希望這有助於。

TL;博士時區

相關問題