System.DateTime.Now 和 System.DateTime.Today 之间的区别

2023-11-29

谁能解释一下两者之间的区别System.DateTime.Now and System.DateTime.Today在 C#.NET 中?如果可能的话,各有利弊。


DateTime.Now返回一个DateTime由运行代码的计算机的本地日期和时间组成的值。它有DateTimeKind.Local分配给其Kind财产。它相当于调用以下任意一个:

  • DateTime.UtcNow.ToLocalTime()
  • DateTimeOffset.UtcNow.LocalDateTime
  • DateTimeOffset.Now.LocalDateTime
  • TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local)
  • TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local)

DateTime.Today返回一个DateTime与上述任何表达式具有相同年、月和日分量的值,但时间分量设置为零。它也有DateTimeKind.Local in its Kind财产。它相当于以下任意一项:

  • DateTime.Now.Date
  • DateTime.UtcNow.ToLocalTime().Date
  • DateTimeOffset.UtcNow.LocalDateTime.Date
  • DateTimeOffset.Now.LocalDateTime.Date
  • TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local).Date
  • TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local).Date

请注意,在内部,系统时钟采用 UTC,因此当您调用DateTime.Now它首先获取 UTC 时间(通过GetSystemTimeAsFileTimeWin32 API 中的函数),然后将值转换为本地时区。 (所以DateTime.Now.ToUniversalTime()DateTime.UtcNow.)

另请注意DateTimeOffset.Now.DateTime将具有相似的值DateTime.Now,但它会有DateTimeKind.Unspecified而不是DateTimeKind.Local- 这可能会导致其他错误,具体取决于您的处理方式。

所以,简单的答案是DateTime.Today相当于DateTime.Now.Date.
但恕我直言 - 您不应该使用其中之一或上述任何等效项。

当你要求DateTime.Now,您正在询问运行代码的计算机的本地日历时钟的值。但你返回的结果并没有关于那个时钟的任何信息!你得到的最好的就是DateTime.Now.Kind == DateTimeKind.Local。但这是谁的本地人呢?一旦您对该值执行任何操作,例如将其存储在数据库中、将其显示在屏幕上或使用 Web 服务传输它,该信息就会丢失。

如果您当地的时区遵循任何夏令时规则,您将无法从DateTime.Now。在模棱两可的情况下,例如在“后退”过渡期间,您将不知道两个可能时刻中的哪一个对应于您检索到的值DateTime.Now。例如,假设您的系统时区设置为Mountain Time (US & Canada)你要求DateTime.Now2013年11月3日凌晨,结果如何2013-11-03 01:00:00意思是?该同一日历日期时间表示两个瞬时时间时刻。如果我将这个值发送给其他人,他们将不知道我指的是哪一个。特别是当他们身处规则不同的时区时。

你能做的最好的事情就是使用DateTimeOffset反而:

// This will always be unambiguous.
DateTimeOffset now = DateTimeOffset.Now;

现在,对于我上面描述的相同场景,我得到了值2013-11-03 01:00:00 -0600在转换之前,或者2013-11-03 01:00:00 -0700过渡后。任何看到这些值的人都可以明白我的意思。

我就这个主题写了一篇博客文章。请阅读 -针对 DateTime.Now 的案例.

此外,世界上有些地方(例如巴西)的“春季向前”过渡恰好发生在午夜。时钟从 23:59 到 01:00。这意味着您获得的价值DateTime.Today在那个日期,不存在!即使你使用DateTimeOffset.Now.Date,你得到了相同的结果,但仍然存在这个问题。因为传统上并没有“Date.Net 中的对象。因此,无论您如何获得该值,一旦去掉时间 - 您必须记住它并不真正代表“午夜”,即使这是您正在使用的值。

如果你真的想要一个完全正确的解决方案来解决这个问题,最好的方法是使用NodaTime. The LocalDate类正确地表示没有时间的日期。您可以获取任何时区的当前日期,包括本地系统时区:

using NodaTime;
...

Instant now = SystemClock.Instance.Now;

DateTimeZone zone1 = DateTimeZoneProviders.Tzdb.GetSystemDefault();
LocalDate todayInTheSystemZone = now.InZone(zone1).Date;

DateTimeZone zone2 = DateTimeZoneProviders.Tzdb["America/New_York"];
LocalDate todayInTheOtherZone = now.InZone(zone2).Date;

如果您不想使用野田时间,现在还有另一个选择。我向 贡献了一个仅日期对象的实现.Net CoreFX 实验室项目。您可以找到System.TimeMyGet feed 中的 package 对象。添加到项目后,您会发现可以执行以下任一操作:

using System;
...

Date localDate = Date.Today;

Date utcDate = Date.UtcToday;

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

System.DateTime.Now 和 System.DateTime.Today 之间的区别 的相关文章

  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 显示异常时的自定义错误消息:从客户端检测到潜在危险的 Request.Form 值

    我在我的 Web 应用程序中使用 ASP NET 的登录控件 当发生此异常时 我想在标签上显示一种有趣的错误类型System Web HttpRequestValidationException A potentially dangerou
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • 自动执行eclipse插件

    我尝试创建一个 Eclipse 插件 当 Eclipse 工作台关闭时 它会删除一些文件 我从Hello World command插件项目并添加了IWorkbenchListener就像本主题中提到的Eclipse 关闭钩子能够停止终止
  • django 对 MongoDB 的内置支持

    我正在尝试查找官方 django 是否支持任何 noSQL DBMS 尤其是 MongoDB 的信息 我找到了一个Django 1 3 的分支 the Django nonrel 官方 django 的一个分支 和其他一些不太可靠的项目 根
  • 填充xaml矩形倍数solidcolorbrush

    xaml中这种类型的填充矩形可以吗 我不想使用渐变来填充矩形 因为每个部分的图像使用不同的纯色画笔 Thanks 尝试这个
  • std::string 构造函数中的内存分配/堆损坏

    我在内存分配方面再次遇到了一些麻烦 但我不明白为什么 当我在调试模式下运行程序时 我收到以下错误消息 我尝试尽可能准确地翻译它 Windows 已触发 LogoColorDetector exe 中的断点 这可能是由堆损坏引起的 这表明 L
  • 代理验证失败错误

    我正在尝试通过 FTP 站点代理访问 FTP 服务器以绕过防火墙it sauronsoftware ftp4j FTPClient我知道我的用户名 密码是正确的 因为我可以使用 FileZilla 进行连接 我尝试使用Authenticat
  • 如何编写多线程函数来同时处理不同的任务?

    我想定义一个do in parallelpython 中的函数将接受带参数的函数 为每个函数创建一个线程并并行执行它们 该函数应该像这样工作 do in parallel sleep 3 sleep 8 sleep 3 然而我很难定义do
  • WPF 数字 UpDown 控件在哪里?

    进入第一个严肃的 WPF 项目 似乎有很多基本的控件都缺失了 具体来说 我正在寻找 Numeric UpDown 控件 我是否错过了乐队外的发行 真的不想写自己的控件 我不想使用 WindowsFormHost 并在其上放置 WinForm
  • “mvn clean install”与“mvn install”有何不同?

    有什么区别mvn clean install and mvn install clean是 Maven 中自己的构建生命周期阶段 可以将其视为操作或任务 mvn clean install告诉 Maven 做clean运行之前每个模块中的阶
  • 如何使用 JsonFormat 将 Jackson Json NULL 字符串反序列化为日期

    我已经看了很多 但到目前为止仍然无法得到答案 非常感谢任何帮助 我有一个简单的String to Date字段映射并尝试将 JSON 字符串读取到 Java 对象 JsonInclude value Include NON EMPTY Js
  • 谷歌电子表格“查询”功能可以在谷歌应用程序脚本中使用吗?

    我正在寻找一种以编程方式填充电子表格的方法 该电子表格根据登录用户过滤另一个电子表格中的数据 我可以使用电子表格中的查询功能来完成此操作 但是 无法找到从应用程序脚本调用查询函数的方法 这可以做到吗 将不胜感激示例代码 谢谢 不知道有没有限
  • 返回之前的 JPanel

    我继承了代码 并且由于需要长时间解释的原因 我需要使用空布局 我一直在尝试利用他们在 JPanels 之间导航的内容 我一直不知道怎么做 这就是我现在所拥有的 它被编译成下面的 SSCCE 我试图做的是将 JPanel 添加到 ArrayL
  • 多类分类中负例的经验法则

    在多类分类任务中 对于表示 其他所有内容 的标签 样本数量应该有多大 是否有一个经验法则 示例 我想将我的输入分类为以下之一X类 这X 1当输入为 以上都不是 时 类将激活 假设我的数据集包含 10 个 正 类别中每个类别的 5 000 个
  • 将 KML 文件读入 R

    我正在构建一个工作流程 用于将多几何 KML 文件读取到 R 中 这是我的工作地图 具有点和路径几何形状 可重现的 R 脚本是 library rgdal setwd SPECIFY A FOLDER download file http
  • 在Python中删除字符

    有人知道如何删除特定字符后面的所有字符吗 像这样 http google com translate t into http google com 如果您询问的是抽象字符串而不是网址 您可以使用 gt gt gt astring http
  • 为什么 set -e 不会导致 `false || 失败假&&真`? [复制]

    这个问题在这里已经有答案了 无法找出合适的标题 我不明白 dash bash 中的行为 也就是说 我使用 set e 在命令失败时进行救援 并使用命令组来处理积极结果 IE 总体方案是 wantcommand command Than 意味
  • 如何在 Windows Phone 项目中导入 C++ dll

    我用 C 创建了一个 DLL 文件 我想将其导入到我的 Windows Phone 项目中 我遵循了来自不同来源的许多说明 即使当我运行我的代码时 我也会收到以下错误 尝试访问该方法失败 rough MainPage Add System
  • python openpyxl读取excel太慢

    我有一个 xlsx 文件 拥有 1841 行 每行有 30 列 使用 openpyxl 将整个信息保存到列表中 def get value i ws article row value ws cell row article row col
  • 是否有可能在 python 中找到 [a,b] 范围内的随机浮点数?

    我试图在 python 中生成 0 8 0 9 范围内的随机浮点数 但不幸的是 我发现的所有工具只能生成 a b 范围内的浮点数随机数 喜欢Random uniform a b 与此同时 我尝试做这样的事情 uniform 0 8 0 90
  • TypeScript 类型特定字符的字符串

    假设我想允许使用十六进制字符串 所以唯一允许的值为 0 9a f TypeScript 有没有办法定义只接受某些字符串的类型字符串 IE valid const valid HexString 123abc invalid const in
  • System.DateTime.Now 和 System.DateTime.Today 之间的区别

    谁能解释一下两者之间的区别System DateTime Now and System DateTime Today在 C NET 中 如果可能的话 各有利弊 DateTime Now返回一个DateTime由运行代码的计算机的本地日期和时