在使用 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个时区,但是结果是不一样的....
本文探讨了在使用NSDateFormatter解析特定日期时遇到的问题,尤其是在涉及中国夏令时的历史背景下。介绍了两种解决方案:一是利用NSDateComponents精确指定日期;二是调整格式化字符串以避免夏令时的影响。
3971

被折叠的 条评论
为什么被折叠?



