iOS--开发中当时间遇到夏令时

最近巧合地发现一个小问题:
有时在iOS开发中我们会用到NSDate、NSCalendar、NSDateComponents来创建一个时间,比如下面的:

///获取GMT格林尼治标准时间
NSDate *date = [NSDate date];
NSLog(@"date = %@",date);

///获取当前北京时间:(注意北京时间=GMT时间+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

另外,Foundation框架为此为我们提供了NSCalendar类,NSCalendar由更自然的日期组成,例如日,月,星期等,可以使用NSDateComponents 和NSCalendar 来创建一个NSDate对象。如:

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

细心的你可能这会应该在数手指头了吧,1,2,3....7,8,9 !!!什么?这什么鬼?再来一遍:1,2,3......7,8,9 !!!怎么回事,不是说北京时间与GMT时间相差8小时吗?为什么会9小时,然后你换回当前时间,输入2016,咦?正常了,再回到1990,又出问题了,1991还是有问题,换到1992又正常了,换到1990年12月,又正常了,这是什么鬼????不会只坑我这个1990年出生的吧?

终于,你想起来了,有个叫做“夏令时”的东西,赶紧百度下吧:
http://baike.baidu.com/link?url=tYe6zOFi8hWN4RHUJbBUAd5r29brYSiSxZ0Xz-bPuydmeJKfGkoYLlorwzmKYARvxXZWhZs8nkRU1831TAQOUK

iOS--开发中当时间遇到夏令时_第1张图片
中国夏令时

看到这一段,顿时大悟了吧,如果你的工程正好用到计算时间,注意一下这点吧,苹果也真是diao,这个历史事件都被它算进系统去了。

你可能感兴趣的:(iOS--开发中当时间遇到夏令时)