Ios 在同一方法和同一线程中初始化时,多个Date()值(timestamp)是否相等?

Ios 在同一方法和同一线程中初始化时,多个Date()值(timestamp)是否相等?,ios,swift,date,Ios,Swift,Date,我很想知道,在同一方法和同一线程中初始化Date()对象将等于orderedSame。我用单元测试用例进行了尝试,但它以附加的屏幕截图的形式给出了各种结果 测试用例在断言#2时失败: 测试用例在断言#4时失败: 测试用例成功: 我认为,Date()的时间成分将根据代码执行时间从date1更改为date5 因此,我们可以说,在第2行创建的Date()对象将不同于在第1行创建的对象吗?绝对每个对象都不同于另一个对象,因为每个对象都有其不同的地址。当您创建Date by Date()时,系统请求

我很想知道,在同一方法和同一线程中初始化
Date()
对象将等于orderedSame。我用单元测试用例进行了尝试,但它以附加的屏幕截图的形式给出了各种结果

测试用例在断言#2时失败:

测试用例在断言#4时失败:

测试用例成功:

我认为,
Date()
的时间成分将根据代码执行时间从
date1
更改为
date5


因此,我们可以说,在第2行创建的
Date()
对象将不同于在第1行创建的对象吗?

绝对每个对象都不同于另一个对象,因为每个对象都有其不同的地址。

当您创建Date by Date()时,系统请求新的时间戳。根据整个系统负载,您可以获得较小的延迟。日期对象对毫秒敏感,因此不能保证对象将在同一毫秒内创建。要检查此项,您可以检查每个日期的时间间隔(此方法将返回Unix时间戳。

您不能假设任何情况

创建初始化为当前日期和时间的日期值

两个连续的
Date()
调用可以返回相同的值,因为

  • 内部时钟的分辨率有限
  • 日期存储为
    时间间隔
    aka
    Double
    ,该时间间隔具有有限的 精确性
通常情况下,这些值是非递减的,但即使如此也不必如此
因为用户可以更改设备的时间设置。

每次调用
Date()
系统从其实时时钟中获取时间。如果在该调用和上一次调用之间经过了任何可测量的时间,则日期将不同。
Date
对象在内部使用
Double
秒计数,其精度为≈15位十进制数字,因此它们能够测量微小的时间跨度(小于皮秒)。我不知道iOS上的实时时钟的精度,但它很可能以纳秒为单位

尝试在目标设备上以发布模式运行此代码:

let arraySize = 1000
var array = [Date]()
var differences = 0
array.reserveCapacity(arraySize)
for _ in 1...arraySize {
    array.append(Date())
}
for index in 0 ..< arraySize-1 {
    if array[index] != array[index+1] {
        differences += 1
        let difference = array[index+1].timeIntervalSinceReferenceDate -
            array[index].timeIntervalSinceReferenceDate
        print("Dates at index \(index) are different! by \(difference)")
    }
}
if differences == 0 {
    print("All dates are equal")
} else {
    print("\(differences) dates were different out of \(arraySize)")
}
let arraySize=1000
变量数组=[Date]()
var差异=0
阵列。保留容量(阵列化)
对于uu1…排列{
array.append(Date())
}
对于0..
我把它作为命令行工具在我的Mac电脑上运行,发现我总是得到至少两个不同的日期。(Mac电脑比iOS设备运行得快得多)


现代iOS设备是多核、中断驱动的设备,因此每次运行的结果都会有所不同。

为什么它们应该相同?每个日期()返回当前时间(以某种分辨率为模)当它被执行时。当你想要相同的值时,为什么要创建一个单独的对象?创建一个并在任何地方使用,直到你需要一个单独的日期。不相关,但没有理由使用
compare()
在Swift中使用
Date
订购相同的
Date
符合
equalatable
。您可以而且应该只使用
=
(我相信
NSDate
也正确地在Swift中实现
=
,但没有理由使用
NSDate
)@MartinR即使数组包含当前的日期对象,例如:[date(),date(),date()],也不能保证数组中的日期值是相同的。对吗?@Natarajan:如果你做
let-array=[date(),date(),date()]
,那么会连续创建三个值,它们不必相等。如果你做
let-array=array(重复:date()),count:3)
则只创建一个值,并复制到所有数组元素。
Date
是一个值,而不是一个对象。即使对于
NSDate
(该对象)而言,
compare()
方法比较表示的时间点,而不是地址。实际上,日期对象使用双精度来表示其值,因此它们对亚皮秒差异很敏感。(双精度具有≈精度的15位小数)。真正的限制是内部时钟的分辨率。感谢您的解释!感谢您的时间!只是吹毛求疵:15位小数是双精度的总精度。对于时间戳,例如565102963.784723,小数点前有9位小数,留下6位小数,即微秒精度。说得好.是有效数字。有趣的是,上面的代码报告了≈最小的是9.5e-07,这似乎低于我预期的分辨率。根据它,是“15到17个有效的十进制数字。”–
让t=Date()。timeintervalencereferencedate;print(t.nextUp-t)
打印1.1920928955078125e-07,这是两个可表示数字之间的差。