gpt4 book ai didi

java - C# Ticks 转换为 java util date;为什么日期晚了5小时?

转载 作者:搜寻专家 更新时间:2023-10-31 19:56:06 24 4
gpt4 key购买 nike

我需要帮助。我一直在试图弄清楚为什么 java util date 在从 C# ticks 转换后落后 5 小时。

C# 中,日期是 6/8/2013 11:02:07 AM,我将此日期转换为刻度,然后将其作为 long 传递给 java。

代码片段:

采取:

- long TICKS_AT_EPOCH = 621355968000000000L;
- long TICKS_PER_MILLISECOND = 10000;

java.util.Date date = new java.util.Date((ctime - TICKS_AT_EPOCH) / TICKS_PER_MILLISECOND);

现在 java util 日期是 Sat Jun 08 06:02:07 CDT 2013

请注意,小时相差 5 小时。

有什么建议吗?

最佳答案

您正在构建一个基于自 1/1/1970 UTC 以来的毫秒数的 java.util.Date。您似乎正在纠正 .net 的 System.DateTime.Ticks 基于 1/1/0001 并且是 10,000 滴答到毫秒的事实。没错,但您忘记调整为 UTC。

在 .Net 中,来自 DateTime.Ticks 的值高度依赖于 DateTime.Kind 属性。存在三种可能的 DateTime 值。

  • DateTimeKind.Utc - 这种表示该值表示 UTC 时间。它通常来自对 DateTime.UtcNow 的调用,但也可以直接构造,而且通常是这样。例如,您可能正在从数据库中检索 UTC 时间。您可以将此处的报价直接输入到您的转换中,它会起作用。

  • DateTimeKind.Local - 这通常来自对 DateTime.Now 的调用。这些值代表本地时区。在检查刻度之前,您需要转换为 UTC。您可以执行以下操作:

    DateTime dt = DateTime.Now;
    int utcTicks = dt.ToUniversalTime().Ticks;

    请注意,如果时间发生在夏令时“回退”样式转换期间,则结果可能不正确。 DateTime 类不知道时区。它只是反射(reflect)了当前的本地时钟。如果 dt 中的值不明确,ToUniversalTime() 将假定该值代表标准时间,即使您只是在获取它时在白天。这只是 .net 中 DateTime 的许多令人困惑和可能的方面之一。

  • DateTimeKind.Unspecified - 这是您会遇到的最常见的 DateTime 类型,通常来自 DateTime.Parse() 或类似 new DateTime(...) 的构造函数。不幸的是,这里没有任何内容可以告诉您这些日期所代表的时区。您仍然可以尝试调用 .ToUniversalTime(),但框架会假设这些时间代表您本地的时区,就好像类型是 Local 一样。该假设可能完全错误,具体取决于您获取数据的方式。确实没有将 Unspecified DateTime 转换为 UTC 值(刻度或其他)的安全方法。

有一些解决方案,比如使用DateTimeOffset代替DateTime,或者使用Noda Time库而不是内置类型。您可以阅读有关这些问题的更多信息 herehere .

关于java - C# Ticks 转换为 java util date;为什么日期晚了5小时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17257962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com