我需要帮助.我一直试图找出为什么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小时的差异.
有什么建议吗?
您正在构建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,或使用诺达时间库,而不是内建类型.你可以阅读更多有关这些问题,在这里和这里.