美文网首页
NSDate 时间比较的时区问题

NSDate 时间比较的时区问题

作者: midmirror | 来源:发表于2019-03-28 14:53 被阅读0次

判断两个时间是否是同一天,是无法用时间戳对比的,两个时间戳间隔在24小时之内不能代表是同一天。

用时间戳对比,也是要计算是否同一年,同一月,同一日,才能判断出是否同一天。

所以通常对比两个时间是用 NSDate 来对比,但是要注意:NSDate 的时间实际上有某个时区的时间的含义,通过 [NSDate date] 创建出来的时间默认是零时区时间,但是这并不意味着两个 NSDate 比较(判断是否同一天)就一定会有正确的结果。

NSDate 比较是否是同一天,本质是比较 NSDateComponents 的 day month year 是否都相等。

比如:

- (BOOL)isSameDayWithDate:(NSDate *)date
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    unsigned unitFlag = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
    NSDateComponents *comp1 = [calendar components:unitFlag fromDate:self];
    NSDateComponents *comp2 = [calendar components:unitFlag fromDate:date];
    return (([comp1 day] == [comp2 day]) && ([comp1 month] == [comp2 month]) && ([comp1 year] == [comp2 year]));
}

网络上很多文章都介绍对 NSDate 或者 NSCalendar 做了扩展,来判断某个日期是否是今天、昨天、明天。实际上 NSCalendar 在 ios(8.0) 开始提供了几个官方方法。

- (BOOL)isDateInToday:(NSDate *)date;

- (BOOL)isDateInYesterday:(NSDate *)date;

- (BOOL)isDateInTomorrow:(NSDate *)date;

但是考虑到用户是可以修改手机时间的,通常我们会使用 ntp 时间作为标准时间,而不直接使用手机时间。

NSCalendar 也有提供了一个方法可以直接对比两个时间。

/*
    This API compares the Days of the given dates, reporting them equal if they are in the same Day.
*/
- (BOOL)isDate:(NSDate *)date1 inSameDayAsDate:(NSDate *)date2 API_AVAILABLE(macos(10.9), ios(8.0), watchos(2.0), tvos(9.0));

但是,在实际场景中,比较两个 NSDate 是否是同一天的时候,通常需要两个 NSDate 同时处于当地时区才有意义。

同样的两个时间,在一个时区是同一天,在另一个时区很可能不是同一天!!!

如果你在东八区,用两个零时区的时间来对比,是会出很大的问题的。

举个例子:

today 1553741981 零时区 2019-03-28 02:59:41 +0000 (东八区 2019-03-28 10:59:41)
day   1553788800 零时区 2019-03-28 15:59:59 +0000 (东八区 2019-03-29 00:00:00)

相关文章

  • NSDate 时间比较的时区问题

    判断两个时间是否是同一天,是无法用时间戳对比的,两个时间戳间隔在24小时之内不能代表是同一天。 用时间戳对比,也是...

  • NSDate

    NSDate *date = [NSDate date]; //获取当前0时区时间 NSDate *date = ...

  • NSDate时区转换

    1. 获取系统时区的NSDate对象 打印[NSDate date]得到的是GTM时区对应的时间也就是0时区:20...

  • 8小时时差问题

    //[NSDate date]获取的是GMT时间,下面获得某个时区的系统时间+(NSDate *)getNowDa...

  • NSDate 时区问题

    https://blog.csdn.net/sqc3375177/article/details/53608867

  • NSDate时区问题

    (1) NSDate *date = [NSDate date];或者NSDate *date1 = [[N...

  • NSDate时区问题

    UTC介绍 iOS是用UTC表示时区的。UTC是协调世界时,又称世界统一时间、时间标准时间、国际协调时间。协调世界...

  • NSSting 与 NSDate 时间戳 恩怨情仇

    NSSting 转 NSDate NSDate 转 NSString 获取本地 NSDate 时区转换 NSDat...

  • NSDate用法

    创建//获取到的是当前时间 格林尼治 时间 +0000 表示0时区NSDate *date1 = [NSDate...

  • iOS 常用类转换

    NSDate 获取当前日期及时间 [NSDate date]获取的时间是标准时区的时间 转换成系统时间: NSDa...

网友评论

      本文标题:NSDate 时间比较的时区问题

      本文链接:https://www.haomeiwen.com/subject/wobqbqtx.html