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 (有兴趣的可以试一下:)