jjzjj

c# - System.DateTime.Now 和 System.DateTime.Today 的区别

coder 2023-07-07 原文

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

最佳答案

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

  • 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在其 Kind属性(property)。它等效于以下任何一项:
  • 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 时间(通过 Win32 API 中的 GetSystemTimeAsFileTime 函数),然后将值转换为本地时区。 (因此 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.Now 2013 年 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过渡之后。任何查看这些值的人都能明白我的意思。

    我写了一篇关于这个主题的博客文章。请阅读 - The Case Against DateTime.Now .

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

    如果你真的想要一个完全正确的解决方案,最好的方法是使用 NodaTime . 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;
    

    如果您不想使用 Noda Time,现在还有另一种选择。我为 .Net CoreFX Lab 贡献了一个仅日期对象的实现。项目。您可以找到 System.Time在他们的 MyGet 提要中打包对象。添加到您的项目后,您会发现您可以执行以下任何操作:
    using System;
    ...
    
    Date localDate = Date.Today;
    
    Date utcDate = Date.UtcToday;
    
    Date tzSpecificDate = Date.TodayInTimeZone(anyTimeZoneInfoObject);
    

    关于c# - System.DateTime.Now 和 System.DateTime.Today 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6545254/

    有关c# - System.DateTime.Now 和 System.DateTime.Today 的区别的更多相关文章

    1. ruby-on-rails - Rails 3 I18 : translation missing: da. datetime.distance_in_words.about_x_hours - 2

      我看到这个错误:translationmissing:da.datetime.distance_in_words.about_x_hours我的语言环境文件:http://pastie.org/2944890我的看法:我已将其添加到我的application.rb中:config.i18n.load_path+=Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s]config.i18n.default_locale=:da如果我删除I18配置,帮助程序会处理英语。更新:我在config/enviorments/devolpment

    2. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

      请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

    3. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

      我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

    4. c# - 如何在 ruby​​ 中调用 C# dll? - 2

      如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

    5. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

      我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

    6. C# 到 Ruby sha1 base64 编码 - 2

      我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

    7. 基于C#实现简易绘图工具【100010177】 - 2

      C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

    8. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

      转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

    9. ruby - 这两段代码有什么区别? - 2

      打印1:defsum(i)i=i+[2]end$x=[1]sum($x)print$x打印12:defsum(i)i.push(2)end$x=[1]sum($x)print$x后者是修改全局变量$x。为什么它在第二个例子中被修改而不是在第一个例子中?类Array的任何方法(不仅是push)都会发生这种情况吗? 最佳答案 变量范围在这里无关紧要。在第一段代码中,您仅使用赋值运算符=为变量i赋值,而在第二段代码中,您正在修改$x(也称为i)使用破坏性方法push。赋值从不修改任何对象。它只是提供一个名称来引用一个对象。方法要么是破坏性

    10. ruby - Ruby 中 .next 和 .succ 的区别 - 2

      Ruby中的Fixnum方法.next和.succ有什么区别?看起来它的工作原理是一样的:1.next=>21.succ=>2如果有什么不同,为什么有两种方法做同样的事情? 最佳答案 它们是等价的。Fixnum#succ只是Fixnum#next的同义词。他们甚至在thereferencemanual中共享同一block. 关于ruby-Ruby中.next和.succ的区别,我们在StackOverflow上找到一个类似的问题: https://stacko

    随机推荐