在将TDateTime(Delphi)转换为Java Calendar对象时,如何避免计算误差?
- 内容介绍
- 文章标签
- 相关推荐
本文共计249个文字,预计阅读时间需要1分钟。
Delphi中的TDateTime以1899年12月30日为纪元,而Java的Calendar使用Unix纪元,即1970年1月1日。以下是将Java Calendar设置为Delphi TDateTime纪元的代码示例:
javaCalendar epoch=Calendar.getInstance(TimeZone.getTimeZone(UTC));epoch.set(1899, 11, 30, 0, 0, 0);System.out.println(epoch.getTimeInMillis());
Delphi TDateTime纪元是1899年12月30日, Java Calendar使用Unix纪元,即1970年1月1日.以下代码:Calendar epoch = Calendar.getInstance(TimeZone.getTimeZone("UTC")); epoch.set(1899, 12, 30, 0, 0, 0); epoch.getTimeInMillis();
给出-2206483199054但是根据手动计算它必须是-2209161600000. delta 2678400946(31天)从哪里来?我错过了什么?
是的,我现在可以使用毫秒作为解决方法,但我想知道错误来自哪里.
附: epoch是java.util.GregorianCalendar的一个实例.
月份字段是从0开始的,所以12月是11月,而不是12月.这就解释了为什么你要离开31天 – 你已经到了1900年1月30日.你可以调用setLenient(false)来捕捉这种错误.
set方法只设置参数中提到的六个字段;它会使其他字段保持不变,包括毫秒字段,这就解释了为什么你实际上已经超过31天了.
The documentation建议您先拨打clear(),但您可能更愿意拨打清除(Calendar.MILLISECOND)以保持时区信息不变.
本文共计249个文字,预计阅读时间需要1分钟。
Delphi中的TDateTime以1899年12月30日为纪元,而Java的Calendar使用Unix纪元,即1970年1月1日。以下是将Java Calendar设置为Delphi TDateTime纪元的代码示例:
javaCalendar epoch=Calendar.getInstance(TimeZone.getTimeZone(UTC));epoch.set(1899, 11, 30, 0, 0, 0);System.out.println(epoch.getTimeInMillis());
Delphi TDateTime纪元是1899年12月30日, Java Calendar使用Unix纪元,即1970年1月1日.以下代码:Calendar epoch = Calendar.getInstance(TimeZone.getTimeZone("UTC")); epoch.set(1899, 12, 30, 0, 0, 0); epoch.getTimeInMillis();
给出-2206483199054但是根据手动计算它必须是-2209161600000. delta 2678400946(31天)从哪里来?我错过了什么?
是的,我现在可以使用毫秒作为解决方法,但我想知道错误来自哪里.
附: epoch是java.util.GregorianCalendar的一个实例.
月份字段是从0开始的,所以12月是11月,而不是12月.这就解释了为什么你要离开31天 – 你已经到了1900年1月30日.你可以调用setLenient(false)来捕捉这种错误.
set方法只设置参数中提到的六个字段;它会使其他字段保持不变,包括毫秒字段,这就解释了为什么你实际上已经超过31天了.
The documentation建议您先拨打clear(),但您可能更愿意拨打清除(Calendar.MILLISECOND)以保持时区信息不变.

