.NET Core 中的日期时间精度

2023-12-07

跟随埃里克·利珀特的post多年前的精确度DateTime,我在装有 Windows 10 的同一台计算机上在 .net core 和 .NET Framework 4.5.2 上运行了他的测试。

        var n = 1000;
        int i = 0;
        long[] diffs = new long[n];
        while (i++ < n-1)
        {
            if (ticks != DateTime.Now.Ticks)
            {
                var newTicks = DateTime.UtcNow.Ticks;
                var diff = newTicks - ticks;
                diffs[i] = diff;
                ticks = newTicks;
            }
        }
        foreach (var d in diffs)
        {
            if (d == 0)
                Console.WriteLine("same");
            else
                Console.WriteLine(d);

        }

.NET Framework 4.5.2 上的结果符合预期:输出中有一些随机“相同”,这意味着DateTime对于某些子级别并不精确。

然而,.NET core 上的结果完全不同:输出中没有“相同”。不是两个Ticks具有相同的值。

该怎么解释呢?


解释是,.net 向底层操作系统询问当前时间。操作系统询问底层硬件。在古代,主板上的硬件时钟 (RTC) 每约 15 毫秒更新一次。 这个数字是根据美国 60Hz 交流线路频率得出的,电网保持足够准确。请记住,那是计算机“慢”的时代,设计师们试图尽可能地发挥每一点性能。因此,每次有人请求时间时,操作系统都不会咨询 RTC,并传递该值的缓存副本 - 该副本很少更新。

后来,主板不断发展,RTC 变得更加精确。但操作系统和其之上的所有东西并不觉得有必要。请记住,硬件的发展速度远远快于软件,甚至直到今天,消费级软件也浪费了很大一部分原始硬件功能。因此,当.net框架向操作系统请求时间时,即使硬件有能力,它也会返回不精确的数据。准确度确实从 15 毫秒发展到了 1 毫秒以下,但仅此而已。

到了windows 8(server 2012),终于意识到(1)应用程序可以通过更精确的时间做得更好(2)计算机速度很快,所以每次查询RTC不再是问题(3)大量的程序员和程序习惯并且实际上依赖于不精确的时间行为。因此他们(win 8)继续引入一种新的稍微慢一些的机制来获取最精确的时间数据,但保持原始实现不变。

点网一直使用较旧且不精确的操作系统功能GetSystemTimeAsFileTime当一个新表弟GetSystemTimePreciseAsFileTime出现在win 8中,.net选择走向后兼容的方式,什么也没做。

Dot net core 是对许多核心功能的全新重写,现在利用了高精度数据源。

Edit

如果当前时间是13:14:15:123456,仍然不能保证物理学家和天文学家所看到的真正的时间。您的计算机不是原子钟。当然也不是一个同步良好的时钟。它唯一的意思是,如果两个事件在不同的时间戳发生,那么一个事件肯定在另一个事件之前发生。在较旧的计算机中,事件(例如日志、文件、数据库 txns 等)的生成率较低,因此顺序事件被分配相同时间戳的可能性很小。这个新的时间系统迎合现代高频率活动,以便您可以将连续事件标记为不同的。尽管如此,对于两个非常接近的事件,总是有可能出现相同的时间戳。这最终是不可避免的。如果您需要纳秒级测量(为什么),您需要不同的工具,例如Stopwatch并不是System.DateTime.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET Core 中的日期时间精度 的相关文章

  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • 析构函数与成员函数竞赛

    当我在析构函数内时 其他线程是否可能开始执行对象的成员函数 遇到这种情况该如何处理呢 C 没有内在的保护来防止在删除对象后使用它 忘记竞争条件 另一个线程可以在完全删除你的对象后使用你的对象 Either 确保只有一个位置 代码拥有该对象
  • 使用 LINQ 展平嵌套字典

    所以我有一本形式的字典Dictionary
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • FFplay成功移入我的Winform中,如何设置它无边框?

    用这个代码 在 C 应用程序中显示 tcp 视频流 来自 FFPLAY FFMPEG https stackoverflow com questions 14201894 show a tcp video stream from ffpla
  • 使用左连接获得不适当的输出

    我正在尝试获取变体列表 并且对于每个变体都获取所有subvariants list无论子变体属于何处 特别的Test say 100 这是示例数据 Id TestId SourceSubVariantId TargetSubVariantI
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 将旧的 Unity 代码升级到 Unity 5

    在触发按钮上播放动画的代码似乎不起作用 我在 Youtube 上看到了一个视频 内容很简单animation Play 它可以在该视频上运行 但我无法让它在我的计算机上运行 我做错了什么还是团结改变了它 请帮助我在网上找不到解决方案 所有
  • 如何将输出重定向到 boost 日志?

    我有一个使用boost log的C 程序 我加载了用户提供的动态链接库 我想将 stderr 重定向到 boost 日志 以便用户的库随时执行以下操作 std cerr lt lt Some stuff 它产生相同的结果 BOOST LOG
  • 解析连接字符串

    是否有标准库或代码片段可以使用这样的连接字符串获取值 string connstr DataServiceUrl http localhost foo RemoteServerConnection server http localhost
  • 如何将 Boost Spirit 自动规则与 AST 结合使用?

    编辑 当我想在另一个规则上使用它时 我扩展了 sehe 的示例以显示问题 http liveworkspace org code 22lxL7 http liveworkspace org code 22lxL7 17 我正在尝试提高 Bo
  • Pandas:按日历周分组,然后绘制真实日期时间的分组条形图

    EDIT 我找到了一个非常好的解决方案并将其发布在下面作为答案 结果将如下所示 您可以为此问题生成一些示例数据 codes list ABCDEFGH dates pd Series pd date range 2013 11 01 201
  • SignalR 在通知/协商请求时抛出 405 错误

    我用这样的角度连接到服务器 this hubConnection new signalR HubConnectionBuilder withUrl location protocol localhost 5000 notify config
  • 从 AuthorizeAttribute 继承的属性不起作用

    我目前正在尝试根据用户角色在新的 ASP MVC 5 应用程序中实现安全性 目标是防止用户在没有特定角色 或更高角色 的情况下访问某些控制器或控制器方法 根据到目前为止我所读到的问题 我创建了一个继承 AuthorizeAttribute
  • 从 RichTextBox 复制文本及其格式

    如何将 RichTextBox 中的文本及其格式复制到写字板或网络浏览器 就像复制纯文本一样 您可以使用Clipboard SetText method http msdn microsoft com en us library 6eahs
  • 快速将文本附加到文本框

    我有一个BackgroundWorker正在发布消息的线程 使用BeginInvoke在 GUI 中的文本框中 方法 write debug text 在文本框中显示文本使用AppendText并将文本写入Console 外观上是这样的Ba
  • 使用 DataGridViewCheckboxCell 真正禁用 DataGridView 中的复选框

    有谁知道如何使用 DataGridViewCheckboxCell 禁用 DataGridView 中的复选框 我可以将其设置为只读 并设置背景颜色 但我无法让复选框本身显示为禁用状态 有什么想法吗 Guess 你必须自己画 http so
  • C++ 在预处理器 #if 中对 sizeof() 比较抛出编译错误

    我有这个 它不会从 Visual Studio 编译错误 致命错误 C1017 无效的整数常量表达式 我该怎么做 template
  • Membership.ValidateUser() 的目的是什么

    我一直在学习有关MembershipProvider类 我认为Membership ValidateUser 方法应该用于登录用户 然而我刚刚了解到有一个FormsAuthentication Authenticate 目的是什么Valid
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • 将字符字段更改为日期

    我有一个遗留的 postgres 数据库 其日期列转换为character 50 字段 不要问 我想更改表格和列以包含实际日期 因为这有效 select distinct to date date begin YYYY DD MM from
  • 如何动态实现api版本控制和swagger文档

    我正在 dotnet core api 工作 我必须在 api 上实现版本控制 swagger文档应该按api版本分类 在 Net Core api 版本控制中 可以通过添加来自 nuget 的以下参考来实现 Microsoft AspNe
  • MYSQL 缺少第一行数据[重复]

    这个问题在这里已经有答案了 我编写了一个 PHP 脚本 其中返回餐厅名称 地址 电话号码 营业时间表和自定义菜单的链接 但是 即使数据库中有周一的条目 当我在 mysqli fetch assoc 中执行 while 循环时 它也不会显示
  • Powershell:如何将一个 CSV 中的唯一标头合并到另一个 CSV 中?

    Edit 1 因此 我已经弄清楚如何获取 CSV 2 中的唯一标头以附加到 CSV 1 header table Get Member MemberType NoteProperty Name header add table add Ge
  • MVP 到 MVVM Android

    这里的一个人告诉我 MVVM 比 MVP 更好 他告诉了我很多优点和很多优点 但我想知道我的 MVP 是否做得很好 或者您是否知道任何其他可能转换为 MVVM 的方法 这是使用 Google MVP 登录 我不会放置所有代码 但我会放置文件
  • C# 鼠标悬停时改变表格行颜色

    我的 winform 中有一个表格布局面板 我想在鼠标悬停在一行时向行添加效果 我想我需要在表格上进行 Mouse over 操作 然后检测表格的行号 然后迭代该行上的每个单元格并更改其背景颜色 问题是我不知道如何获取行号 有什么想法吗 E
  • cer、pvk 和 pfx 文件之间有什么区别?

    cer pvk 和 pfx 文件之间有什么区别 另外 我要保留哪些文件以及我应该将哪些文件提供给我的交易对手 Windows 使用 X 509 证书的 cer 扩展名 这些可以是 二进制 ASN 1 DER 也可以使用 Base 64 进行
  • 使用 AccountManagement 扩展类时如何设置二进制属性?

    我正在使用一个自定义类以在 Active Directory 中公开一些自定义架构 我正在存储一个二进制 blob 根据项目要求 该数据必须存储在 AD 中 我不能使用外部存储 如果可以的话我会这样做 当我创建用户时 它可以很好地存储 bl
  • 在一次调用中检索存储库及其标签版本的列表

    我有两个天蓝色的 CLI 查询 az acr repository list 检索我的容器注册表中的存储库列表 az acr repository show tags 检索第一个查询返回的每个存储库的版本标记 这会导致初始调用来检索列表 然
  • 如何从表单中获取 int 而不是 string?

    从表单获取变量
  • 如何通过JavaScript中的正则表达式将camelCase更改为slug-case(或kebab-case)

    因为某些原因 这个答案我发现 据说 如何在 php 中做到这一点只是给了我错误的匹配 它似乎添加了破折号 但也用字符串其余部分的副本替换了大写字母 所以我希望 abcZxc 变成 abc zxc 但它把它变成 abd zxczxc 这 加上
  • 将第三方 js 文件与 TypeScript 结合使用

    我是 typeScript 的新手 我希望能够使用没有定义文件的第三方库 Typescript 是否允许您使用外部库 我尝试使用的库是 filesaver jshttps github com eligrey FileSaver js 我需
  • 使用 Python 以无密码的用户身份登录 Windows

    我这里有一个情况 使用Python 我创建了一个进程 以系统或管理员用户身份运行 并且我需要使用不同的用户名 无需密码 调用应用程序 因此 阅读下面的链接 结论是可能的 使用 Kerberos 模拟另一个没有密码的用户 但我没有找到任何用
  • Crosswalk 从 JavaScript 调用 Java 方法

    我现在正在走人行横道 当用户单击 HTML 中的按钮时 我需要调用 Java 方法 该方法可能如下所示 a href Start a 我不确定是否人行横道延长线就是我想要的 仅仅为了调用Java函数似乎就很重了 有没有更简单的方法来做到这一
  • 在 SQLite 错误中插入多行(错误代码 = 1)

    在 SQLite Android 中执行以下查询时出现错误 sDataBase execSQL query 插入联系人 ID 名字 姓氏 电话号码 电子邮件 ID 状态 值 ae0caa6a 8ff6 d63f 0253 110b20ac2
  • 如何在具有设定名称的文件夹中列出谷歌驱动器中的所有文件?

    我的驱动器中有一个文件夹 其中包含多个 客户端 文件夹 每个客户端文件夹都具有相同的结构 其中包括一个包含已完成发票 称为 已完成发票 的文件夹 我需要一种方法来遍历所有名为 Completed Invoices 的文件夹 并在 Googl
  • 将 Codeigniter 3 应用于新域名主机会导致 session_files_drive.php 出现 mkdir() 错误

    我有一个 Codeigniter 框架设置 我将其跨多个域设置作为默认起点 它给了我以下错误 当我添加全新安装的 CI3 并添加数据库信息以及以下自动加载时 情况是一样的 autoload libraries array database
  • 理解python中的执行流程

    对于 python 新手 对执行流程感到困惑 为了详细说明 我陈述以下示例 示例1 def hello print hello world python def python print testing main if name main
  • 自动检测/转换数据类型?

    numpy中是否有一个函数可以确定字符串应该是整数还是浮点数并自动转换它们 例如 我经常有一个记录集合 这些记录是使用以下组合从文本文件中解析出来的 str strip and str split 然后我得到类似的东西 List 1 a 3
  • .NET Core 中的日期时间精度

    跟随埃里克 利珀特的post多年前的精确度DateTime 我在装有 Windows 10 的同一台计算机上在 net core 和 NET Framework 4 5 2 上运行了他的测试 var n 1000 int i 0 long