iOS中UTC/GMT时间与地时区时间 转换总结
2017-10-25 本文已影响42人
Console_Liu
-
什么是UTC时间
- 协调世界时(英:Coordinated Universal Time ,法:Temps Universel Coordonné),又称世界统一时间,世界标准时间,国际协调时间。英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC(摘自百度百科) 。
- 中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8(相差八个小时)
- 这套时间系统被应用于许多互联网和万维网的标准中,因此在日常开发中UTC时间的使用较为常见
-
格林尼治标准时(GMT)
- 是指位于伦敦郊区的皇家格林尼治天文台的标准时间(开发中不常用)
-
特别注意:
- iOS中的NSDate对象存放的日期始终是UTC的标准时间(比如下面的例子,服务器返回的字符串是utc时间,本地时区是北京)
- 有结果可知:时间字符串转成NSDate时,没有指定时间字符串的时区,系统会根据本地时区,将时间字符串转成utc时间存放在NSDate对象中(通过Summary可以看出),而NSLog打印NSDate时,又会根据当地时区将utc时间转成本地时区时间打印出来。
- 结论:NSDate中存放的时间会自动转换成utc时间,NSLog打印的时间会自动根据时区打印不同的结果
NSDateFormatter *format = [[NSDateFormatter alloc] init]; format.dateFormat = @"yyyy-MM-dd HH:mm:ss"; NSString *timeStr = @"2017-10-25 02:07:39"; //将时间字符串默认当本地时区处理,转成NSDate时 -8,打印时再 +8 NSDate *timeDate = [format dateFromString:timeStr]; // Summary 2017-10-24 18:07:39 UTC NSLog(@"timeDate = %@", timeDate); //timeDate = Wed Oct 25 02:07:39 2017 format.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; //将时间字符串当utc处理,打印时根据本地时区自动打印 +8 NSDate *utcDate = [format dateFromString:timeStr]; // Summary 2017-10-25 02:07:39 UTC NSLog(@"timeDate = %@", utcDate); //timeDate = Wed Oct 25 10:07:39 2017
-
转换函数
/**
anyDate 转成 本地时区的 NSDate
*/
- (NSDate *)getLocalDateFormatAnyDate:(NSDate *)anyDate {
NSTimeZone *sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];//或GMT
NSTimeZone *desTimeZone = [NSTimeZone localTimeZone];
//得到源日期与世界标准时间的偏移量
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:anyDate];
//目标日期与本地时区的偏移量
NSInteger destinationGMTOffset = [desTimeZone secondsFromGMTForDate:anyDate];
//得到时间偏移量的差值
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
//转为现在时间
NSDate* destinationDateNow = [[NSDate alloc] initWithTimeInterval:interval sinceDate:anyDate];
return destinationDateNow;
}
/**
将本地日期字符串转为UTC日期字符串
eg: 2017-10-25 02:07:39 -> 2017-10-24 18:07:39
*/
- (NSString *)getUTCStrFormateLocalStr:(NSString *)localStr {
NSDateFormatter *format = [[NSDateFormatter alloc] init];
format.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *dateFormatted = [format dateFromString:localStr];
format.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
NSString *dateString = [format stringFromDate:dateFormatted];
return dateString;
}
/**
将UTC日期字符串转为本地时间字符串
eg: 2017-10-25 02:07:39 -> 2017-10-25 10:07:39
*/
- (NSString *)getLocalDateFormateUTCDate:(NSString *)utcStr {
NSDateFormatter *format = [[NSDateFormatter alloc] init];
format.dateFormat = @"yyyy-MM-dd HH:mm:ss";
format.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
NSDate *utcDate = [format dateFromString:utcStr];
format.timeZone = [NSTimeZone localTimeZone];
NSString *dateString = [format stringFromDate:utcDate];
return dateString;
}
- 演示结果:
NSDateFormatter *format = [[NSDateFormatter alloc] init]; format.dateFormat = @"yyyy-MM-dd HH:mm:ss"; format.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; NSString *utcStr = @"2017-10-25 02:07:39"; NSDate *utcDate = [format dateFromString:utcStr]; // Summary 2017-10-25 02:07:39 UTC NSDate *localDate = [self getLocalDateFormatAnyDate:utcDate]; // Summary 2017-10-25 10:07:39 UTC NSLog(@" utcDate = %@", [NSString stringWithFormat:@"%@", utcDate]); //utcDate = 2017-10-25 02:07:39 +0000 NSLog(@"localDate = %@", [NSString stringWithFormat:@"%@", localDate]); //localDate = 2017-10-25 10:07:39 +0000 //这样打印的话,NSLog又会给localDate +8 NSLog(@"localDate = %@", localDate); //localDate = Wed Oct 25 18:07:39 2017