dart DateTime.fromMillisecondsSinceEpoch未返回精确的日期时间对象

rqenqsqc  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(163)

我尝试从数据库中获取一个int值来构造一个DateTime对象,但是返回的对象与原始对象不相等,下面是一些测试代码:

void main() {
  final d = DateTime.now();
  final ms = d.millisecondsSinceEpoch;
  final d1 = DateTime.fromMillisecondsSinceEpoch(ms).;
  print(d);
  print(d1);
  print(d1 == d);
}

输出(在android studio中作为控制台应用运行):

2020-03-18 20:57:14.887582
2020-03-18 20:57:14.887
false

但是,在DartPad中运行这段代码会输出两个对象相等,我遗漏了什么?

92dk7w1h

92dk7w1h1#

然而,在DartPad中运行这段代码会输出两个对象相等。
当你在网络上运行Dart代码时,包括DartPad,注意打印DateTime.now()的结果并不 * 打印微秒精度的时间。因此你的问题实际上 * 不是 * 关于相等性检查(两个对象确实表示相同的时间并且应该相等),这就是为什么DateTime在DartPad中不如在其他平台上精确。
现代的网页浏览器已经显式地降低了计时器的精确度,以阻止基于计时的攻击(例如Spectre)。

  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#reduced_time_precision
  • https://v8.dev/blog/spectre#high-precision-timers.

此外,Dart for web被移植到JavaScript,并且也受到JavaScript的限制。JavaScript Date objects不支持微秒,因此Dart DateTime对象在该环境中也不会报告微秒。(另请参见https://github.com/dart-lang/sdk/issues/44876.

相关问题