C#Ticks转换为javautil日期;日期晚了5个小时为什么?
我需要帮助。我一直在试图弄清楚为什么java util date在从C#Ticks转换为javautil日期;日期晚了5个小时为什么?,java,c#,date,Java,C#,Date,我需要帮助。我一直在试图弄清楚为什么java util date在从Cticks转换后落后了5个小时 在C#中,日期是2013年8月6日上午11:02:07,我将此日期转换为刻度,然后将其作为long传递给java 代码段: 采取: - long TICKS_AT_EPOCH = 621355968000000000L; - long TICKS_PER_MILLISECOND = 10000; java.util.Date date = new java.util.Date((ctime -
C
ticks转换后落后了5个小时
在C#
中,日期是2013年8月6日上午11:02:07,我将此日期转换为刻度,然后将其作为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日期是2013年6月8日星期六06:02:07 CDT
请注意,时差为5小时
有什么建议吗?java.util.date会自动为您的时区进行更正。请参阅此问题:ctime是UTC(世界协调时间),它是参考格林威治的时间标准。你在中央时间表达你的时间。这就是你的不同之处。时间不是落后5小时,而是完全相同的时间。问题在于打印的方式
在将日期转换为字符串时,需要告诉C#和Java使用相同的时区。其中一个使用UTC,另一个使用CDT。您正在构建一个
java.util.Date
,它基于UTC 1970年1月1日以来的毫秒数。您似乎正在纠正.net的System.DateTime.Ticks
是基于1/1/0001的,是10000个滴答到一毫秒。这是正确的,但您忘记了调整到UTC
在.Net中,来自DateTime.Ticks
的值高度依赖于DateTime.Kind
属性。有三种可能的DateTime
值
-此类值表示Utc时间。它通常来自对DateTimeKind.Utc
的调用,但也可以直接构造,通常是这样。例如,您可能正在从数据库检索UTC时间。您可以从这里直接将滴答声输入到转换中,它将起作用DateTime.UtcNow
-这通常来自对DateTimeKind.Local
的调用。这些值代表本地时区。在检查刻度之前,您需要转换为UTC。您可以执行以下操作:DateTime.Now
请注意,如果时间发生在夏时制“后退”样式转换期间,则结果可能不正确。DateTime dt = DateTime.Now; int utcTicks = dt.ToUniversalTime().Ticks;
类不知道时区。它只反映了当前的本地时钟。如果DateTime
中的值不明确,dt
将假定该值代表标准时间,即使您只是在白天检索该值。这只是.net中ToUniversalTime()
的许多令人困惑和可能的方面之一DateTime
-这是您将遇到的最常见的DateTimeKind.Unspecified
,通常来自DateTime
或类似于DateTime.Parse()
的构造函数。不幸的是,这里没有任何东西可以告诉你这些日期所代表的时区。您仍然可以尝试调用new DateTime(…)
,但框架将假设这些时间代表您的本地时区,就好像这些时间是.ToUniversalTime()
。这一假设可能是完全错误的,这取决于你如何获取数据。确实没有安全的方法将本地的
未指定的
转换为UTC值(滴答声或其他)日期时间
有一些解决方案,例如使用
DateTimeOffset
而不是DateTime
,或者使用库而不是内置类型。您可以阅读更多关于这些问题和问题的信息。我仍然感到困惑。我在C#应用程序中从SQL数据库(服务器位于中央时间)读取日期,并将其分配给C#DateTime对象。它在C#应用程序中显示正确的日期和时间,但我不确定DateTime设置为哪个时区。这是C#应用程序显示的日期:2013年6月8日星期六11:02-5:00