使用DateComponents减去2个日期会产生未定义的行为

时间:2018-01-19 01:54:38

标签: swift date nsdatecomponents

鉴于以下方法,我在扩展名中添加了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 组件添加到Set中,为什么我会收到0天。

我在下面的操场中提供了两个截图,第一个没有包含.weekOfYear,第二个包含.weekOfYear

<code>.weekOfYear</code> commented out

<code>.weekOfYear</code> included

1 个答案:

答案 0 :(得分:3)

在以下代码中

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时,它会将值2分配给weekOfYear。如果你要打印weekOfYear,你将获得2(因为日期是2周)。由于在将日期转换为周后没有留下任何天数,因此diff3.weekOfYear为0天。如果您使用日期diff3.dayJan 16th,则每周的值为2,日期为1