移动开发 \ iOS \ NSDate中夏令时的坑你知道吗

NSDate中夏令时的坑你知道吗

总点击31
简介:  最近朋友在进行iOS开发时候遇到了字符串转NSDate对象为nil的bug。下面就给大家演示下哦,先上代码:

   最近朋友在进行iOS开发时候遇到了字符串转NSDate对象为nil的bug。下面就给大家演示下哦,先上代码:

NSString *timeStr = @"1988-04-10 00:00:00";

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDate * date1 = [formatter dateFromString:timeStr];

NSLog(@"date1 %@",date1);

打印结果如下:

2017-10-20 22:49:03.043 NSDateDemo[53138:10162816] date1 (null)

为什么会是nil呢,明明字符串的格式和formatter的格式一样。网上各种搜索发现是夏令时的原因,下面简单给大家介绍一下夏令时。

  夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。


1986年4月,中国中央有关部门发出“在全国范围内实行夏时制的通知”,具体作法是:每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整(北京夏令时),再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。在夏令时开始和结束前几天,新闻媒体均刊登有关部门的通告。1992年起,夏令时暂停实行。


   下面经过搜索找出了中国实行夏令时的时间


1935年至1951年,每年5月1日至9月30日。


1952年3月1日至10月31日。


1953年至1954年,每年4月1日至10月31日。


1955年至1956年,每年5月1日至9月30日。


1957年至1959年,每年4月1日至9月30日。


1960年至1961年,每年6月1日至9月30日。


1974年至1975年,每年4月1日至10月31日。


1979年7月1日至9月30日。


1986年4月13日至9月14日,


1987年4月12日至9月13日,


1988年4月10日至9月11日,


1989年4月16日至9月17日,


1990年4月15日至9月16日,


1991年4月14日至9月15日。


参考网址:http://www.d1xz.net/xp/xialing/


在这些时间段内的时间零时都是不存在的,1:00表示零时。仅仅是中国就有这么多时间,世界上很多的国家, 有的国家实行了夏令时,有的没有实行,如果每个国家都去单独处理的话,估计要把人累死,而且难以保证数据的准确性。有没有更好的办法去处理呢,网上搜索了一下formatter.lenient = YES; 就可以了,网上没有太多的解释,经过自己的分析,这个应该是允许如果时间不存在的话,可以获取距离最近的整点时间。

NSString *timeStr = @"1988-04-10 00:00:00";

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

formatter.lenient = YES;

NSDate * date1 = [formatter dateFromString:timeStr];

NSLog(@"date1 %@",date1);

运行后的log如下:

2017-10-20 23:00:51.270 NSDateDemo[53261:10189200] date1 1988-04-09 16:00:00 +0000

果然解决了,以后大家进行字符串转NSDate对象的时候加上这一句代码就可以避免夏令时造成的bug。如果有那里解释的完善,或者不准确的地方,还请大家多多指教,一块进步哦。

意见反馈 常见问题 官方微信 返回顶部