NSDateFormatter夏令时问题

本文探讨了在使用NSDateFormatter解析特定日期时遇到的问题,尤其是在涉及中国夏令时的历史背景下。介绍了两种解决方案:一是利用NSDateComponents精确指定日期;二是调整格式化字符串以避免夏令时的影响。

在使用 NSDateFormatter 获取 NSDate 时, 竟然遇到某些特殊的日期返回了nil,在一番搜索后,发现是夏令时问题,


 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyyMMdd";
   NSDate* date =  [formatter dateFromString:@"19880410 "];
</pre><p></p><p></p><p>1986年至1991年,中华人民共和国在全国范围实行了六年夏令时,每年从4月中旬的第一个星期日2时整(北京时间)到9月中旬第一个星期日的凌晨2时 整(北京夏令时)。除1986年因是实行夏令时的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。1992年4月5日后不再实 行。</p><p></p><p>碰到这种问题,最好是不要用 NSDateFormatter 来获取 时间了, 如果明确了 年月日,可以使用  NSDateComponents 来返回对应日历的 date;</p><p> 还有一种简便的偷懒方法,将 格式化对应到小时, 不从零点起算 </p><p>   </p><pre code_snippet_id="1643524" snippet_file_name="blog_20160412_3_3245119" name="code" class="objc">birthday = [NSString stringWithFormat:@"%@ 02", birthday];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyyMMdd HH";
    
    return [formatter dateFromString:birthday];

补充一种解决方法:


当NSDateFormatter没有指定TimeZone的时候,在中国设备上一般默认都是Asia/Shanghai时区

为了把更改量降到最低

使用 [NSTimeZone timeZoneForSecondsFromGMT:3600*8]; 设置时区

不要使用[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]

虽然理论上shanghai是比GMT多了8个时区,但是结果是不一样的....


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值