Swift 3两个日期之间的时间间隔错误
我想确定使用DateComponents创建的两个日期之间的时间间隔。如果我在第二年的第一年做第一次约会,我会得到365天,0小时,0分和0秒。如果我将日期分开(400年在这里),突然我的约会关闭了11分56秒。这里是代码:Swift 3两个日期之间的时间间隔错误
import Foundation
var mycal = Calendar(identifier: .iso8601)
var datum = DateComponents(year:1600, month:1, day:1, hour:12, minute:0,
second:0)
let j2000 = DateComponents(year:2000, month:1, day:1, hour:12, minute:0,
second:0)
let datum_date = mycal.date(from: datum)
let j2000_date = mycal.date(from: j2000)
let interval = mycal.dateComponents([.day, .hour, .minute, .second], from:j2000_date!, to:datum_date!)
print("Datum: \(datum_date!)") //1600-01-01 19:48:04 +0000
print("j2000: \(j2000_date!)") //2000-01-01 20:00:00 +0000
请注意倒数第二行:注释显示打印产生的内容。我也试过格里历,也是同样的问题。我不确定究竟发生了多少不一致,我已经回溯到足够多的时间,并且有时似乎“坚持”,因为我再次更改密码。奇怪的是,“间隔”似乎显示正确的天数(这里-146097),但显示的日期不正确,我可能需要在我的计算。有人有主意吗?
这个区别可能与leep年份的调整有关,但是会有11分14秒的差异(还有40秒不明的,其中26秒可能是leep秒)。
见:https://www.infoplease.com/leap-year-101-next-when-list-days-calendar-years-calculation-last-rules
从理论上讲,如果你计算与分和秒的精度多年的时间差,你应该得到5个小时的变化48分钟46秒,每3出的四年第四年11分14秒。我不知道macOS(Unix)是如何处理的,他们可能需要考虑一系列的考虑因素(特别是超过400年,11分14秒被调整)。
如果您的用例需要这种精度级别,我建议您阅读一下计时的详细信息。考虑到日期在内部存储为秒数,在这些长时间内返回精确的日期和时间必须要求一些特殊的数学杂技。
请参阅Apple的文档:https://developer.apple.com/reference/foundation/nscalendar
非常感谢Alain,但实际上这并没有解决这个问题。这种差异在广泛的“遥远”日期中持续存在。我曾尝试使用DateFormatter()将日期作为字符串(实际上具有正确的时间)并将其转换为日期(正如Leo Dabus暗示的那样)。这并不能解释为什么直接打印Date对象不正确,但它确实允许我在计算中使用这些值。 – Aloft
没有错误。 –
“间隔”中没有错误,但为什么在11:56之前生成的日期是?我编辑了我的第一段;我错误地说我的间隔时间已到,但实际上是生产日期。谢谢。 – Aloft
日历调整。 https://en.wikipedia.org/wiki/Gregorian_calendar你为什么需要这个? –