- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要帮助。我一直在试图弄清楚为什么 java util date 在从 C#
ticks 转换后落后 5 小时。
在 C#
中,日期是 6/8/2013 11:02:07 AM,我将此日期转换为刻度,然后将其作为 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 日期是 Sat Jun 08 06:02:07 CDT 2013
请注意,小时相差 5 小时。
有什么建议吗?
最佳答案
您正在构建一个基于自 1/1/1970 UTC 以来的毫秒数的 java.util.Date
。您似乎正在纠正 .net 的 System.DateTime.Ticks
基于 1/1/0001 并且是 10,000 滴答到毫秒的事实。没错,但您忘记调整为 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
类不知道时区。它只是反射(reflect)了当前的本地时钟。如果 dt
中的值不明确,ToUniversalTime()
将假定该值代表标准时间,即使您只是在获取它时在白天。这只是 .net 中 DateTime
的许多令人困惑和可能的方面之一。
DateTimeKind.Unspecified
- 这是您会遇到的最常见的 DateTime
类型,通常来自 DateTime.Parse()
或类似 new DateTime(...)
的构造函数。不幸的是,这里没有任何内容可以告诉您这些日期所代表的时区。您仍然可以尝试调用 .ToUniversalTime()
,但框架会假设这些时间代表您本地的时区,就好像类型是 Local
一样。该假设可能完全错误,具体取决于您获取数据的方式。确实没有将 Unspecified
DateTime
转换为 UTC 值(刻度或其他)的安全方法。
有一些解决方案,比如使用DateTimeOffset
代替DateTime
,或者使用Noda Time库而不是内置类型。您可以阅读有关这些问题的更多信息 here和 here .
关于java - C# Ticks 转换为 java util date;为什么日期晚了5小时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17257962/
我正在使用ScheduledExecutorService使用 scheduleAtFixedRate 方法每小时提供一次数据库更新。问题是它逐渐变得更晚 - 在长期服务中我一直在记录它并且每天大约一
我有一个连接到 UILabel 的 UIDatePicker。我希望用户选择 18 年前的生日(年龄限制)。所以我用这一行来设置 maximumDate 值: datePicker.maximumDa
当我重新启动设备时,我收到 BOOT_COMPLETED广播比其他应用程序慢得多(大约 10-15 秒后)。 我看过this .但我不认为这是完全正确的。我如何(我认为)证明它是错误的: (让我们将
我有一个从 DatePickerDialog 的 onDateSetListener 调用的 TimePickerDialog,以便允许用户依次选择日期和时间。我将信息存储在日历对象 calendar
我需要查找客户是否在上一年和下一年进行了订阅,以及下一年有多少订阅是新的或被取消的。 示例数据: 身份证订阅年份120101201112019220112201232010 考虑这种方法:在订阅年份中
我必须编写一个 JavaScript 函数来检查两个日期(格式为 dd/MM/yyyy)的时间间隔是否最多为 3 个月。 我可以从两个文本框中检索两个值(无需检查格式,我已经获得了一个可以自动正确设置
我有一个输入框,类型为“时间”。我想将迟到时间 (23:00pm) 作为最小值,将早期时间 (6:00am) 作为最大值 - 创建一个 23pm - 6am 的范围。 (即中午 11 点、中午 12
我是一名优秀的程序员,十分优秀!