将TDateTime(Delphi)表示为Java Calendar对象时的计算错误

时间:2012-01-18 13:47:18

标签: java delphi

Delphi TDateTime时代是 1899年12月30日,Java Calendar使用 1970年1月1日的Unix纪元。以下代码:

Calendar epoch = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
epoch.set(1899, 12, 30, 0, 0, 0);
epoch.getTimeInMillis();

给出 -2206483199054 ,但根据手动计算,它必须是 -2209161600000 。 delta 2678400946 (31天)来自哪里?我错过了什么?

是的,我现在可以使用毫秒作为解决方法,但我想知道错误的来源。

P.S。 epochjava.util.GregorianCalendar的实例。

2 个答案:

答案 0 :(得分:4)

月份字段从0开始,因此12月是11月,而不是12月。这就解释了为什么你在31天之前离开了 - 你已经到了1900年1月30日。你可以致电setLenient(false)来抓住有时会出现这种错误。

set方法仅设置参数中提到的六个字段;它使其他字段保持不变,包括毫秒字段,这解释了为什么你实际上离稍微超过 31天。

The documentation建议您先致电clear(),但您可能更愿意致电clear(Calendar.MILLISECOND)以保持时区信息的完整。

答案 1 :(得分:3)

而不是

epoch.set(1899, 12, 30, 0, 0, 0);

使用

epoch.set(1899, Calendar.DECEMBER, 30, 0, 0, 0);

因为月份数从零开始(0 = 1月)

当毫秒也被设置为0时,结果是-2209161600000(JDK 1.6)