【问题标题】:Date compare returning wrong value? (swift)日期比较返回错误值? (迅速)
【发布时间】:2016-12-27 18:30:57
【问题描述】:

我正在尝试快速比较两个日期。在此solution 之后编写了以下代码:

let workoutdate: NSDate = participantdata[self.lastindexchecked].workout!.start!
let todaysdate = NSDate()
let order = NSCalendar.currentCalendar().compareDate(todaysdate, toDate: workoutdate, toUnitGranularity: .Day)

switch order {
case .OrderedDescending:
    print("DESCENDING")
case .OrderedAscending:
    print("ASCENDING")
case .OrderedSame:
    print("SAME")
}

但是,此代码似乎并不总是返回所需的结果。

tod​​aysdate 等于:

2016-08-20 20:51:26 +0000

当锻炼日期等于:

2016-08-20 00:14:53 +0000

结果为“DESCENDING”

但是,当锻炼日期设置为其他日期时,例如,

2016-08-20 04:00:00 +0000

结果确实与预期的“相同”。

有人知道发生了什么吗?

【问题讨论】:

    标签: swift2 ios9 nsdate


    【解决方案1】:

    NSDate 是 Foundation 中的一个基本结构,因此类似的错误早就被检测到并修复了。在您认为这是 Apple 的错误之前,请先考虑您自己的错误。处理涉及时区的日期最令人头疼的事情。

    我在 EDT (-0400) 时区所以:

    todaysdate  = 2016-08-20 20:51:26 +0000 = 2016-08-20 16:51:26 -0400
    workoutdate = 2016-08-20 00:14:53 +0000 = 2016-08-19 20:14:53 -0400
    

    您可以看到在我的时区中表示时,它们是如何落在不同的日子的,DESCENDING 正是这里所期望的。

    您可以通过将日历设置为始终使用 GTM 来解决此问题:

    let calendar = NSCalendar.currentCalendar()
    calendar.timeZone = NSTimeZone(forSecondsFromGMT: 0)
    let order = calendar.compareDate(todaysdate, toDate: workoutdate, toUnitGranularity: .Day)
    

    【讨论】:

    • 很抱歉将问题表述为 Apple 错误——这不是我的本意。我错误地认为 +0000 表示时区,显然情况并非如此。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多