关于使用NSDate遇到的问题总结

问题:使用【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是正常的。

以下是调试代码

15_05_22__07_04_2018.jpg
15_05_51__07_04_2018.jpg

经过各种尝试和资料查找得出结论

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
还有相关伙伴的指导,感谢。

你可能感兴趣的:(关于使用NSDate遇到的问题总结)