【问题标题】:Subtracting 2 Dates using DateComponents gives undefined behavior使用 DateComponents 减去 2 个日期会产生未定义的行为
【发布时间】:2018-06-28 05:15:53
【问题描述】:

鉴于我在扩展中添加到 Date 对象的以下方法:

extension Date {
    static func -(left: Date, right: Date) -> DateComponents {
        let components: Set<Calendar.Component> = [
            .year,
            .month,
            .day,
            .hour,
            .minute,
            .second,
            //.weekOfYear, // issue!
        ]

        let gregorian = Calendar(identifier: .gregorian)
        let dateComponents = gregorian.dateComponents(components, from: right, to: left)
        return dateComponents 
    }
}

给定以下日期(格式为月日、年、hh:mm:ss),您得到 1:

let day1 = Date(timeIntervalSince1970: 1516003200) // January 15, 2018, 00:00:00
let day2 = Date(timeIntervalSince1970: 1516089600) // January 16, 2018, 00:00:00
let diff = day2 - day1
print(diff.day!) // 1

但给定以下日期,您也会得到 1:

let day3 = Date(timeIntervalSince1970: 1515916800) // January 14, 2018, 00:00:00
let day4 = Date(timeIntervalSince1970: 1516089600) // January 16, 2018, 00:00:00
let diff2 = day4 - day3
print(diff.day!) // 1

所以我的第一个问题是想知道 为什么即使其中一个相隔 1 天而另一个相隔 2 天,日差却相同。

最后,给定以下日期,你得到正确的数字 14:

let day5 = Date(timeIntervalSince1970: 1516089600) // January 16, 2018, 00:00:00
let day6 = Date(timeIntervalSince1970: 1517299200) // January 30, 2018, 00:00:00
let diff3 = day6 - day5
print(diff3.day!)

但是,如果您要返回 static func -(left:right:) 并取消注释 .weekOfYear 并使用 day5day6 重新运行上述代码块,您将获得 0 天。所以我的第二个问题是如果我将 .weekOfYear 组件添加到集合中,为什么我会得到 0 天。

我在下面附上了两张游乐场的截图,第一张不包括.weekOfYear,第二张包括.weekOfYear

【问题讨论】:

  • 第 3 天 - 第 4 天我得到 2 天你打印错误的变量 print(diff.day!),而你应该打印 print(diff2.day!)
  • 我用您的day3day4 进行了测试,测试了每个时区,在所有时区中,day 的差异为 2。

标签: swift date nsdatecomponents


【解决方案1】:

在下面的代码中

let day3 = Date(timeIntervalSince1970: 1515916800) // January 14, 2018, 00:00:00
let day4 = Date(timeIntervalSince1970: 1516089600) // January 16, 2018, 00:00:00
let diff2 = day4 - day3
print(diff.day!) // 1

您正在使用diff.day,而实际上您应该使用diff2.day

至于您的第二期,日历将通过从最大值到最小值的分配来返回日期组件。也就是说,当你添加weekOfYear时,它会为weekOfYear赋值2。如果您要打印出diff3.weekOfYear,您将得到 2(因为日期是 2 周)。由于在日期转换为周后没有剩余天数,因此diff3.day 为 0 天。如果你使用日期Jan 16thJan 31st,你会得到一个星期的值2,一天的值1

【讨论】:

    猜你喜欢
    • 2021-01-29
    • 2021-08-23
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多