NSCalendar的方法误差问题

278 阅读1分钟

使用NSCalendar的如下方法获取日期:

- (BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate * _Nullable * _Nullable)datep interval:(nullable NSTimeInterval *)tip forDate:(NSDate *)date;

实例代码如下

    NSDate *from;
    NSDate *to;
    double interfrom;
    double interto;
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierISO8601];
    [calendar setTimeZone:[NSTimeZone timeZoneWithName:LocaleName]];
    [calendar rangeOfUnit:NSCalendarUnitDay startDate:&from interval:&interfrom forDate:fromDate];
    [calendar rangeOfUnit:NSCalendarUnitDay startDate:&to interval:&interto forDate:toDate];
    NSDateComponents *difference = [calendar components:NSCalendarUnitDay fromDate:from toDate:to options:0];
    NSInteger days = difference.day;
    return days;

参数如下:

fromDate:2020-02-28 13:14:29 +0000:

toDate:2020-02-23 10:14:29 +0000

localName:@"Australia/Melbourne";

from和to得到的值如下:

from:2020-02-28 13:00:00 +0000

to:2020-02-22 13:00:00 +0000

to的日期前移了一天,变成了22号,这是为什么;

如果将Timezone的初始化改为如下方式:

//    [calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:timeZoneInteger*3600]];
timezoneInteger的值为10

得到的from和to值如下:

from:2020-02-27 14:00:00 +0000

to:2020-02-22 14:00:00 +0000

**NSTimeZone两种初始化方式,都是墨尔本的时区,为什么结果会不同呢?
**

其他城市和对应的时区两种方式初始化NSTimeZone,得到的from和to结果也不同,但是timeZoneForSecondsFromGMT:timeZoneInteger:方式初始化更为可靠。