C#Ticks转换为java util date; 日期落后5小时?

Joe*_*ith 5 c# java date

我需要帮助.我一直试图找出为什么java工具日期在从C#ticks 转换后落后5个小时.

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

代码段:

采取:

- 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);
Run Code Online (Sandbox Code Playgroud)

现在java的工作日期是星期六08月06日06:02:07 CDT 2013

请注意,小时是5小时的差异.

有什么建议吗?

Mat*_*int 5

您正在构建java.util.Date基于自1970年1月1日UTC以来的毫秒数.您似乎正在纠正.net的System.DateTime.Ticks基于1/1/0001并且10,000个刻度到1毫秒的事实.这是正确的,但你忘了调整到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;
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,如果在夏令时"后退"样式转换期间发生时间,则结果可能不正确.该DateTime班有没有约时区的想法.它只反映了当前的本地时钟.如果值dt不明确,ToUniversalTime()则假设该值代表标准时间,即使您在白天时间检索它也是如此.这只是DateTime.net中许多令人困惑和可能的方面之一.

  • DateTimeKind.Unspecified- 这是DateTime你将遇到的最常见的一种,通常来自DateTime.Parse()或类似的构造函数new DateTime(...).很遗憾,这里没有任何内容可以告诉您这些日期代表的时区.您仍然可以尝试呼叫.ToUniversalTime(),但框架会假设这些时间代表您当地的时区,就像那种时候一样Local.这种假设可能完全错误,具体取决于您采购数据的方式.确实没有安全的方法可以将Unspecified DateTimeUTC 转换为UTC值(滴答或其他).

有一些解决方案,如使用DateTimeOffset替代DateTime,或使用诺达时间库,而不是内建类型.你可以阅读更多有关这些问题,在这里这里.


小智 0

java.util.date 自动更正您的时区。请参阅这个问题:How to set time zone of a java.util.Date?