最近巧合地發(fā)現(xiàn)一個(gè)小問題:
有時(shí)在iOS開發(fā)中我們會(huì)用到NSDate、NSCalendar舌涨、NSDateComponents來創(chuàng)建一個(gè)時(shí)間糯耍,比如下面的:
///獲取GMT格林尼治標(biāo)準(zhǔn)時(shí)間
NSDate *date = [NSDate date];
NSLog(@"date = %@",date);
///獲取當(dāng)前北京時(shí)間:(注意北京時(shí)間=GMT時(shí)間+8h)
NSDate *bjDate = [NSDate dateWithTimeIntervalSinceNow:8*60*60];
NSLog(@"bjDate = %@", bjDate);
輸出為:
2016-06-28 18:54:10.921 Tank[3159:256082] date = 2016-06-28 10:54:10 +0000
2016-06-28 18:54:10.922 Tank[3159:256082] bjDate = 2016-06-28 18:54:10 +0000
另外,F(xiàn)oundation框架為此為我們提供了NSCalendar類,NSCalendar由更自然的日期組成囊嘉,例如日温技,月,星期等扭粱,可以使用NSDateComponents 和NSCalendar 來創(chuàng)建一個(gè)NSDate對(duì)象舵鳞。如:
NSCalendar *currentCalendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc]init];
components.year = 1990;
components.month = 05;
components.day = 20;
components.hour = 13;
components.minute =22;
components.second = 16;
NSDate *aDate = [currentCalendar dateFromComponents:components];
NSLog(@"aDate = %@",aDate);
輸出為:注意這里輸出為04:22:16
2016-06-28 18:54:10.922 Tank[3159:256082] aDate = 1990-05-20 04:22:16 +0000
細(xì)心的你可能這會(huì)應(yīng)該在數(shù)手指頭了吧,1琢蛤,2蜓堕,3....7,8博其,9 L撞拧!贺奠!什么霜旧?這什么鬼?再來一遍:1儡率,2挂据,3......7,8儿普,9 F樘印!眉孩!怎么回事个绍,不是說北京時(shí)間與GMT時(shí)間相差8小時(shí)嗎勒葱?為什么會(huì)9小時(shí),然后你換回當(dāng)前時(shí)間巴柿,輸入2016凛虽,咦?正常了广恢,再回到1990凯旋,又出問題了,1991還是有問題钉迷,換到1992又正常了至非,換到1990年12月,又正常了糠聪,這是什么鬼荒椭??舰蟆?趣惠?不會(huì)只坑我這個(gè)1990年出生的吧?
終于身害,你想起來了信卡,有個(gè)叫做“夏令時(shí)”的東西,趕緊百度下吧:
http://baike.baidu.com/link?url=tYe6zOFi8hWN4RHUJbBUAd5r29brYSiSxZ0Xz-bPuydmeJKfGkoYLlorwzmKYARvxXZWhZs8nkRU1831TAQOUK
看到這一段题造,頓時(shí)大悟了吧,如果你的工程正好用到計(jì)算時(shí)間猾瘸,注意一下這點(diǎn)吧界赔,蘋果也真是diao,這個(gè)歷史事件都被它算進(jìn)系統(tǒng)去了牵触。