【问题标题】:C# DateTime in nanoseconds vs UTC and local [duplicate]C# DateTime 以纳秒为单位与 UTC 和本地 [重复]
【发布时间】:2021-02-22 22:19:41
【问题描述】:

我的数据库中有以下值:637406344505540000,它代表 UTC 时间。

当我运行这行代码时。

return new DateTime(ticks, DateTimeKind.Local); // it returns 11/10/2020 7:47:30 PM

我尝试将 Kind 设置为 UTC 它返回相同。

这是我在 Visual Studio 的即时窗口中执行的结果

new DateTime(637406344505540000, DateTimeKind.Local);
{11/10/2020 7:47:30 PM}
    Date: {11/10/2020 12:00:00 AM}
    Day: 10
    DayOfWeek: Tuesday
    DayOfYear: 315
    Hour: 19
    Kind: Local
    Millisecond: 554
    Minute: 47
    Month: 11
    Second: 30
    Ticks: 637406344505540000
    TimeOfDay: {19:47:30.5540000}
    Year: 2020

new DateTime(637406344505540000, DateTimeKind.Utc);
{11/10/2020 7:47:30 PM}
    Date: {11/10/2020 12:00:00 AM}
    Day: 10
    DayOfWeek: Tuesday
    DayOfYear: 315
    Hour: 19
    Kind: Utc
    Millisecond: 554
    Minute: 47
    Month: 11
    Second: 30
    Ticks: 637406344505540000
    TimeOfDay: {19:47:30.5540000}
    Year: 2020

在我看来,对于 Kind local,它应该返回以下内容: 2020 年 11 月 10 日星期二 14:47:30 GMT-0500(东部标准时间)

有一个网络工具可以帮助我理解我的价值是正确的。

https://grammarofdev.blogspot.com/2017/02/c-ticks-to-datetime.html

它显示了与我的数据库中的刻度相对应的本地和 UTC 值。

有什么我做的不对吗?

【问题讨论】:

  • 试试new DateTime(637406344505540000, DateTimeKind.Local).ToString("o"),你会看到Local和Utc之间的区别。
  • 如果您对DateTime 谎报该值是UTC 还是本地,那么您会得到不正确的结果。由于该值存储为 UTC,因此您需要以相同的方式对其进行反序列化。使用ToLocalTime() 转换为当地时间。见重复。更好的是,停止使用DateTime,而改用DateTimeOffset,它具有更好的内置时区处理功能。或使用 Noda(第三方日期/时间库)。

标签: c# .net datetime timestamp


【解决方案1】:

构造函数中传递的DateTimeKind仅用于分配Kind属性。它不会改变Ticks所代表的挂钟时间。

由于您的值是以 UTC 形式存储的,因此首先使用 UTC 类型创建您的 DateTime,然后根据需要将其转换为本地时间。

DateTime dt = new DateTime(637406344505540000, DateTimeKind.Utc).ToLocalTime();

【讨论】:

  • 除此之外 - 我不确定您使用的是哪个数据库,但大多数数据库都有日期和时间的本机类型,这比将它们存储为刻度更好。
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
相关资源
最近更新 更多