问题:使用【NSDate date】获取当前时间,来计算今天/明天/昨天时,因为时差,出现多出8小时问题。
世界标准时间UTC /GMT 转为当前系统时区对应的时间
根据之前的经验和网上资料,一直使用下边的处理
/*
当前日期:处理时间差
*/
+ (NSDate *)nowDateFromatAnDate:(NSDate *)anyDate
{
//设置源日期时区
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];//或GMT
//设置转换后的目标日期时区
NSTimeZone* destinationTimeZone = [NSTimeZone localTimeZone];
//得到源日期与世界标准时间的偏移量
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:anyDate];
//目标日期与本地时区的偏移量
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:anyDate];
//得到时间偏移量的差值
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
//转为现在时间
NSDate* destinationDateNow = [[NSDate alloc] initWithTimeInterval:interval sinceDate:anyDate];
return destinationDateNow;
}
之前一直这样使用,没有任何问题,但是在我们接入了一个三方库后,在用这个方法处理,再用NSDateFormatter 转换就会出现多增加时区的问题。在未接入这个库时用NSDateFormatter是正常的。
以下是调试代码
经过各种尝试和资料查找得出结论
1、要把当前时间进行+/-,需要用NSDateFormatter形式来处理,而不能直接对NSDate +/-;
2、转出来的时间是原参数NSDate的时区,所以在再次使用NSDateFormatter 转换就会出现时区不对。
3、之前为什么没有问题,现在还没找到原因。
补充:为了最小改动,对原转换方法做特殊处理,但不建议以后还用这个方法
/*
当前日期:处理时间差
*/
+ (NSDate *)nowDateFromatAnDate:(NSDate *)anyDate
{
// 解决接入三方库之后,date 返回不是UTC问题
if (![[anyDate description] containsString:@"+"]) { // 如果anyDate 是UTC时区,需要+8小时,如果不是,不做处理;UTC时区的都是 『12:53:51+0800』 格式
return anyDate;
}
//设置源日期时区
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];//或GMT
//设置转换后的目标日期时区
NSTimeZone* destinationTimeZone = [NSTimeZone localTimeZone];
//得到源日期与世界标准时间的偏移量
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:anyDate];
//目标日期与本地时区的偏移量
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:anyDate];
//得到时间偏移量的差值
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
//转为现在时间
NSDate* destinationDateNow = [[NSDate alloc] initWithTimeInterval:interval sinceDate:anyDate];
return destinationDateNow;
}
以上结论参考了:https://blog.csdn.net/fengsh998/article/details/9731617
还有相关伙伴的指导,感谢。