转换时间遇到的坑

app里因为时区问题,所以需要进行时间转换,下面是我们常用的时间转换的方法
遇到的问题:将北京时间2015-12-28转换成当地时间,使用的系统时区为东八区,讲道理应该转成的时间是一致的,但是得到的结果却很让我意外,是2016-12-28,时间居然差了一年.废话不多说,直接上代码

//TimerTansform
@interfaceTimerTansform :NSObject
+ (NSString*)convertBeijingTimeToLocalTime :(NSString*)beijingTimeString;
@end
@implementationTimerTansform
+ (NSString*)convertBeijingTimeToLocalTime :(NSString*)beijingTimeString {
return[selfconvertBeijingTimeToLocalTime:beijingTimeStringdateFormatterString:@"YYYY-MM-dd HH:mm:ss"];
}
+ (NSString*)convertBeijingTimeToLocalTime:(NSString*)beijingTimeString dateFormatterString:(NSString*)dateFormatterString{
NSTimeZone*beijingTimeZone = [NSTimeZonetimeZoneWithName:@"Asia/Beijing"];
NSDateFormatter*formatter = [[NSDateFormatteralloc]init];
[formattersetDateFormat:dateFormatterString];
formatter.timeZone= beijingTimeZone;
NSDate*serverTime = [formatterdateFromString:beijingTimeString];
NSTimeZone*localTimeZone = [NSTimeZonesystemTimeZone];
formatter.timeZone= localTimeZone;
NSString*localTimeString = [formatterstringFromDate:serverTime];
NSLog(@"server: %@local: %@", beijingTimeString, localTimeString);
returnlocalTimeString;
}
@end
//调用方法
-(void)transform{
NSString*str = [NSStringstringWithFormat:@"2015-12-28 00:00:00"];
str = [TimerTansformconvertBeijingTimeToLocalTime:str];
}

输出的日志为:server: 2015-12-28 00:00:00local: 2016-12-28 00:00:00
但是如果把 YYYY-MM-dd HH:mm:ss 改成 yyyy-MM-dd HH:mm:ss
输出的日志为:server: 2015-12-28 00:00:00local: 2015-12-28 00:00:00

结论

大家在格式化时间的时候需要注意一个地方:
yyyy-MM-dd HH:mm:ss 与 YYYY-MM-dd HH:mm:ss 转化出来的时间可能会出现不一样(在年底与年初的那几天),后者转出来的时间可能会比真实的时间多一年或者少一年。yyyy是真实的年,YYYY表示的是周所在的年
详情可以参考:https://segmentfault.com/q/1010000000174542 (有兴趣的可以试一下:)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容