iOS开发过程中,服务端为了兼容国际化,返回给客户端的时间是带有时区的字符串格式(例如:“2020-02-25T06:02:44.000+0000”),我们需要把它转化成本地时区的时间(例如:2020-02-25 14:02:44)。
/**
- 将UTC日期字符串转为本地时间字符串
- eg: 2020-02-21T07:24:41.000+0000 -> 2020-02-21 15:24:41
*/
-
(NSString *)getLocalDateFormateUTCDate:(NSString *)utcStr
{
//ISO 8601 格式的时间转换
[self.formatter setDateFormat:@“yyyy-MM-dd’T’HH:mm:ss.SSSZZZ”];
NSDate *date = [self.formatter dateFromString:utcStr];NSDateFormatter *format = [[NSDateFormatter alloc] init];
format.dateFormat = @“yyyy-MM-dd HH:mm:ss”;
NSString *dateString = [format stringFromDate:date];return dateString;
}
处理的思路是,先将UTC时间字符串直接转换成带时区格式的NSDate,然后设置新的时间格式去接收,使用stringFromDate:方法将带时区格式的NSDate转换成新的字符串。UTC时间字符串虽然带了时区格式,但是实际时区是0,stringFromDate:内部在UTC时间的基础上加上硬件系统当前的时区,然后返回当前的时间。
GMT(Greenwich Mean Time) 格林尼治时间,是以太阳一天之中的位置为根据的时间,地点在英国伦敦的格林尼治天文台;是早起的世界共用时间。(后来被发现时间不够精准,因为地球自转的速度正在变慢)。
UTC(Coordinated Universal Time )是根据原子的物理特性,以原子钟来衡量的时间,精度非常高;是世界标准时间,不属于任何时区。
iOS获取当前时间:
NSDate *date = [NSDate date];
NSLog(@“date = %@” , date);
这里直接通过+date方法获取的时间是已经在UTC时间的基础上转换过当前时区了,获取的就是当前所在地的时间。
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @“yyyy-MM-dd HH:mm:ss”; [formatter setTimeZone:[NSTimeZone timeZoneWithName:@“Asia/Tokyo”]];
NSString *string = [formatter stringFromDate:date]; NSLog(@“string = %@” , string);
这里是将时区设置成东京,获得的时间就是有一个小时时差的东京时间。