gpt4 book ai didi

ios - 为什么在UTC时区中比较两个NSDate总是失败?

转载 作者:行者123 更新时间:2023-12-01 18:08:19 24 4
gpt4 key购买 nike

我正在尝试测试我的一种方法可以正确比较两次。除非我将时区添加到我的组件中,否则它可以正常工作:

_calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];

NSDateComponents *components = [[NSDateComponents alloc] init];


components.second = 31;
components.minute = 21;
components.hour = 5;
components.day = 30;
components.month = 3;
components.year = 2016;
components.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
_mar30_2016Morning = [_calendar dateFromComponents:components];


components.second = 01;
components.minute = 00;
components.hour = 22;
components.day = 30;
components.month = 3;
components.year = 2016;
components.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
_mar30_2016Evening = [_calendar dateFromComponents:components];



//Test two dates are equal
-(void) testCompareWithoutTimeTo
{
XCTAssertEqual([_mar30_2016Morning compareWithoutTimeTo:_mar30_2016Evening],NSOrderedSame);
}

方式:
-(NSComparisonResult) compareWithoutTimeTo:(NSDate *) otherDate {
NSDate *this = [self copy];
NSDate *that = [otherDate copy];
return [[NSCalendar currentCalendar] compareDate:this toDate:that toUnitGranularity:NSCalendarUnitDay];;
}

第二种方式:
NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
[[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay startDate:&this interval:NULL forDate:this];
[[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay startDate:&that interval:NULL forDate:that];
NSComparisonResult result = [this compare:that];

这些日期在同一天,必须返回相同的日期,但是返回的日期是不同的日子?!

最佳答案

这很令人困惑,而且没有很好的记录。

@RobMayoff告诉您出了什么问题,但这需要进一步的解释。

这是我对其运作方式的理解。您创建NSDateComponents并为其指定一个时区。然后,您将它们转换为NSDates,后者会丢弃时区信息,并将这些日期表示为与iOS纪元时间(始终为UTC)的偏移量。 (NSDate对象没有时区,它们表示地球上任何地方的时间瞬间。)

最后,您要求日历对象比较两个日期。在进行比较之前,日历对象会将提供的日期转换为其时区。如果两个日期分别位于日历的当前时区的不同日期,则您将获得不相等的日期。

解决方案是在进行比较之前,创建一个日历并将其时区设置为UTC。

因此,只需在发布的代码中添加第二行:

_calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
_calendar.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; //This is the fix

编辑:

正如rmaddy在他的评论中指出的那样,不需要以UTC比较日期。您只需要确保创建日期并使用相同的时区进行比较即可。由于使用NSDateComponents创建时区为UTC的输入日期,因此需要将它们与也设置为UTC的日历进行比较。

关于ios - 为什么在UTC时区中比较两个NSDate总是失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36878802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com