Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Ticks转换为javautil日期;日期晚了5个小时为什么?_Java_C#_Date - Fatal编程技术网

C#Ticks转换为javautil日期;日期晚了5个小时为什么?

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 -

我需要帮助。我一直在试图弄清楚为什么java util date在从
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

  • 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()
    ,但框架将假设这些时间代表您的本地时区,就好像这些时间是
    本地的
    。这一假设可能是完全错误的,这取决于你如何获取数据。确实没有安全的方法将
    未指定的
    日期时间
    转换为UTC值(滴答声或其他)


有一些解决方案,例如使用
DateTimeOffset
而不是
DateTime
,或者使用库而不是内置类型。您可以阅读更多关于这些问题和问题的信息。

我仍然感到困惑。我在C#应用程序中从SQL数据库(服务器位于中央时间)读取日期,并将其分配给C#DateTime对象。它在C#应用程序中显示正确的日期和时间,但我不确定DateTime设置为哪个时区。这是C#应用程序显示的日期:2013年6月8日星期六11:02-5:00