鉴于以下方法,我在扩展名中添加了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
并使用day5
和day6
重新运行上述代码块,则会获得0天。所以我的第二个问题是如果我将 .weekOfYear
组件添加到Set中,为什么我会收到0天。
我在下面的操场中提供了两个截图,第一个没有包含.weekOfYear
,第二个包含.weekOfYear
:
答案 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.day
和Jan 16th
,则每周的值为2,日期为1