Delphi tdatetime到Java Date / Calender

我有一个问题,德尔福 – 在那里破解.

我的Java应用程序正在与Delphi应用程序通信.
Delphi应用程序在其UI中显示一些日期值,这些日期值应通过文件传输到Java应用程序中.

但是,不是UTC或任何时间字符串,delphi应用程序导出一些浮点数,我希望它们只是日期的内部tdatetime值.

以下使用MM / dd / YYYY格式说明了这一点:

> UI:2014年10月10日 – >出口:41919,00
> UI:05/31/2017 – >出口:42887,00
>用户界面:09/30/2015 – >出口:42277,00
> UI:08/31/2016 – >出口:42613,00

我知道,Delphi tdatetime值使用30/12/1899作为参考.

因此,我希望以下代码snipet可以做到这一点:

Calendar c = Calendar.getInstance();

c.set(1899, 11, 30, 0, 0);// init delphi version of start of time

c.add(Calendar.DATE, <FloatingPoint>); // add in the days
// minutes not required as all values end with .00

SimpleDateFormat sdf = new SimpleDateFormat();
System.out.println(sdf.format(c.getTime())); // voila

但令我惊讶的是,这是不正确的

>出口:41919,00 – > Java:10/07/14 00:00(正确)
>出口:42887,00 – > Java:06/01/17 00:00(失败,1天)
>出口:42277,00 – > Java:09/30/15 00:00(正确)
>出口:42613,00 – > Java:08/31/16 00:00(正确)

那么我的代码片段和转换有什么问题?

实际上我没有应用程序本身,只是UI的截图和导出的文件.因此,屏幕截图和导出本身可能并不完全正确.

这也可以解释为什么

> UI:05/31/2017 – > 42887,00,有时42886,00

还有其他解释吗?我认为它可能与Java和Delphie中闰年的不同处理方式有关,但我无法弄清楚这一点.

使用Date并执行一些ms-addition时会出现相同的问题.转换后的日期并不总是与UI中的预期值匹配.

任何人都使用与上面类似的snipet将delphi tdatetime转换为java并且没有遇到任何故障?

最佳答案

program Project1;

{$APPTYPE CONSOLE}

uses
  DateUtils;

var
  t : TDateTime;
  d : double;
begin
  t := EncodeDateTime(2017,05,31,0,0,0,0);
  d := t;
  WriteLn(d);
  ReadLn;
end.

根据源数据的建议,此值输出值42886,而不是42887.我怀疑你的截图和文本文件并不完全准确.

对于没有小数分量的日期时间值,您的方法是正确的.

点赞