由于维护老版本的项目中遇到时区错乱的问题,需要更新解决这个问题就需要把系统当地的时区给转化为世界标准时间来处理。注意改的时候可以让服务器把服务器和数据库的时间也给改成世界标准时间。
我的思路如下:
-上传时间先获取当前的系统时间(由于上传的时候都会用到pickerView,所以我直接写死一个时间):
NSString *str1 = "2016-12-12 12:30:00";
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *date = [format dateFromString:str1];
NSTimeZone *zone = [NSTimeZone systemTimeZone]; // 获得系统的时区
NSLog(@"获得系统的时区:%@",zone);
NSTimeInterval time = [zone secondsFromGMTForDate:date];// 以秒为单位返回当前时间与系统格林尼治时间的差
NSLog(@"当前时间与系统格林尼治时间的差/s:%f",time);
//将获取后的本地时间 转换成世界标准时间UTC
format.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
NSString *timeStr = [format stringFromDate:date];
//这个就是转换后的UTC标准时间值
NSLog(@"``````%@",timeStr);
-从服务器上获取的+0时区,转化为当前系统时间
NSString *str1 = "2016-12-12 12:30:00";
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *date = [format dateFromString:str1];
//设置源日期时区
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];//或GMT
//设置转换后的目标日期时区
NSTimeZone* destinationTimeZone = [NSTimeZone localTimeZone];
//得到源日期与世界标准时间的偏移量
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:date];
//目标日期与本地时区的偏移量
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:date];
//得到时间偏移量的差值
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
//转为现在时间
NSDate* destinationDateNow = [[NSDate alloc] initWithTimeInterval:interval sinceDate:date];
NSString *str = [format stringFromDate:destinationDateNow];
注:不同时间测试的时候可以用真机测试,方法为:设置-通用-日期与时间-自动设置给关掉,手动去测试就好了