Delphi tdatetime 到 Java Date/Calender
Delphi tdatetime to Java Date/Calender
我有一个问题要问你 Delphi-破解。
我的 Java 应用程序正在与 Delphi 应用程序通信。
Delphi 应用程序在其 UI 中显示了一些日期值,这些日期值应通过文件传输到 Java 应用程序。
但是 delphi 应用程序导出一些浮点数而不是 UTC 或任何时间字符串,我希望它们只是日期的内部 tdatetime 值。
以下使用 MM/dd/YYYY 格式对此进行了说明:
- UI:10/07/2014 -> 出口:41919,00
- UI:2017 年 5 月 31 日 -> 出口:42887,00
- UI:2015 年 9 月 30 日 -> 出口:42277,00
- UI:2016 年 8 月 31 日 -> 出口:42613,00
我知道,Delphi tdatetime 值使用 30/12/1899 作为参考。
因此,我希望以下代码片段能够解决问题:
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 中对闰年的不同处理有关,但我一直无法弄清楚。
使用日期并改为执行一些 ms-additions 时会出现同样的问题。转换后的日期并不总是与 UI.
中的预期值匹配
有人使用与上述类似的代码段将 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。我怀疑您的屏幕截图和文本文件并不完全准确。
对于没有小数部分的日期时间值,您的方法是正确的。
我有一个问题要问你 Delphi-破解。
我的 Java 应用程序正在与 Delphi 应用程序通信。 Delphi 应用程序在其 UI 中显示了一些日期值,这些日期值应通过文件传输到 Java 应用程序。
但是 delphi 应用程序导出一些浮点数而不是 UTC 或任何时间字符串,我希望它们只是日期的内部 tdatetime 值。
以下使用 MM/dd/YYYY 格式对此进行了说明:
- UI:10/07/2014 -> 出口:41919,00
- UI:2017 年 5 月 31 日 -> 出口:42887,00
- UI:2015 年 9 月 30 日 -> 出口:42277,00
- UI:2016 年 8 月 31 日 -> 出口:42613,00
我知道,Delphi tdatetime 值使用 30/12/1899 作为参考。
因此,我希望以下代码片段能够解决问题:
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 中对闰年的不同处理有关,但我一直无法弄清楚。
使用日期并改为执行一些 ms-additions 时会出现同样的问题。转换后的日期并不总是与 UI.
中的预期值匹配有人使用与上述类似的代码段将 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。我怀疑您的屏幕截图和文本文件并不完全准确。
对于没有小数部分的日期时间值,您的方法是正确的。