NSDate中夏令时的坑你知道吗

来源:互联网 发布:mac文件共享 xp 编辑:程序博客网 时间:2024/05/19 05:04

   最近朋友在进行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。如果有那里解释的完善,或者不准确的地方,还请大家多多指教,一块进步哦。

原创粉丝点击