C#Ticks转换为java util date;日期比原因晚了5个小时
本文关键字:小时 5个 日期 转换 java util date C#Ticks | 更新日期: 2023-09-27 18:19:37
我需要帮助。我一直在试图弄清楚为什么javautil日期在从C#
ticks转换后延迟了5个小时。
在C#
中,日期是2013年8月6日上午11:02:07,我将此日期转换为ticks,然后将其作为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日期是6月8日星期六06:02:07 CDT 2013
请注意,小时相差5小时。
有什么建议吗?
您正在构建自1970年1月1日UTC以来基于毫秒的java.util.Date
。您似乎在纠正这样一个事实,即.net的System.DateTime.Ticks
基于1/10001,是10000个刻度到一毫秒。这是正确的,但您忘记了调整到UTC。
在.Net中,来自DateTime.Ticks
的值高度依赖于DateTime.Kind
属性。CCD_ 8值有三种可能的类型。
-
DateTimeKind.Utc
-这类表示该值表示UTC时间。它通常来自对DateTime.UtcNow
的调用,但也可以直接构造,而且通常是这样。例如,您可能正在从数据库中检索UTC时间。你可以从这里直接把记号输入到你的转换中,它会起作用的。 -
DateTimeKind.Local
-这通常来自对DateTime.Now
的调用。这些值代表当地时区。在检查刻度之前,您需要转换为UTC。您可以执行以下操作:DateTime dt = DateTime.Now; int utcTicks = dt.ToUniversalTime().Ticks;
请注意,如果时间发生在夏令时"回退"样式转换期间,则结果可能不正确。
DateTime
类不知道时区。它只是反映了当前的本地时钟。如果dt
中的值不明确,ToUniversalTime()
将假定该值代表标准时间,即使您只是在夏令时中检索到该值。这只是.net.中DateTime
的许多令人困惑和可能出现问题的方面之一 -
DateTimeKind.Unspecified
-这是你会遇到的最常见的DateTime
类型,通常来自DateTime.Parse()
或类似new DateTime(...)
的构造函数。不幸的是,这里没有任何内容可以告诉你这些日期所代表的时区。您仍然可以尝试调用.ToUniversalTime()
,但框架会假设这些时间代表您的本地时区,就好像类型是Local
一样。这种假设可能是完全错误的,这取决于你是如何获取数据的。确实没有安全的方法将Unspecified
DateTime
转换为UTC值(刻度或其他)。
有一些解决方案,例如使用DateTimeOffset
而不是DateTime
,或者使用Noda Time库而不是内置类型。你可以在这里和这里阅读更多关于这些问题的信息。
时间并没有落后5小时,而是完全相同的时间。问题出在你打印的方式上。
在将日期转换为字符串时,您需要告诉C#和Java使用相同的时区。其中一个使用UTC,另一个使用CDT。
java.util.date会自动更正您的时区。请参阅以下问题:如何设置java.util.Date的时区?
ctime
是UTC(世界协调时间),这是一个参考格林威治的时间标准。你在中央时间表达你的时间。这就是你的不同。