1

我需要在从 Easy-IP 提取的 XML 数据中转换一些日期+时间戳。我不认识原始值,它们似乎是一个浮点值,但整数部分对于 UNIX 风格来说太小了。

我可能会再次遇到从这种类型的系统中提取的数据,所以我想要一种标准的转换方法,它不依赖于直接访问数据库(可能不同或无法访问)

我相信后端数据库是 Firebird,但根据他们的文档,他们从 1753 年 1 月 1 日开始计数。

一些样本值(每行是一个不同的实体),它们都应该指过去 15 年发生的活动,而且可能更近:

CREATED="39660.2632087847" UPDATED="39660.2632160185"
CREATED="39660.2631284838" UPDATED="39750.4032429514"
FIRST_SUCCESSFUL_CONTACT="39668.128960544"  LAST_SUCCESSFUL_CONTACT="41301.0505147685"
FIRST_SUCCESSFUL_CONTACT="39668.1289603588" LAST_SUCCESSFUL_CONTACT="41301.0505142245"

我希望其他人以前已经看过这个,而不是提出一个难题。如果您有可靠的方法使用 XSL、Java 或(不太受欢迎的)PERL 转换为日期+时间戳,则可以加分。

4

2 回答 2

2

我的猜测是这些值来自内部 Delphi TDateTime表示:

Delphi 程序在内部将 TDateTime 值表示为浮点值,整数部分表示自 1899 年 12 月 30 日以来的天数,小数部分表示自午夜以来的天数。

所以,例如,

  • 39660Jul-31-2008
  • 0.26320878476:19:01.239 AM

因此,您的第一个示例是2008-07-31 06:19:01

我不认为数据是日期的内部火鸟表示,所以我的猜测也是原始系统不使用TimeStamp数据类型,而是使用双精度或其他数字类型来存储日期。

综上所述,转换日期的最简单方法似乎是在 Delphi 中编写一个程序来更改日期表示。例如,为了计算显示的日期,我写道:

procedure TForm1.Button1Click(Sender: TObject);
var
  Dt: TDateTime;
begin
  Dt := 39660.2632087847;
  ShowMessage(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz', Dt));
end;

如果您手头没有 Delphi,还有其他使用类似表示的工具,如果您运气不好,您现在拥有所有信息来自己做数学。转换为 UnixTime 并不是特别困难。

于 2013-02-26T08:03:48.673 回答
0

我找不到这种 Java 转换的准确示例。这是我将使用的简化版本:

public static String convertEasyIPTime (double dateTimeDouble, String timeZoneCode) {

  TimeZone tz = TimeZone.getTimeZone(timeZoneCode);

  long days = (long) dateTimeDouble;
  long adjustedDays = days - 25569; // Days between Jan 1st 1753 (Delphi) and Dec 31st 1970 (Java)

  long datePortion = adjustedDays * 24 * 60 * 60 * 1000;
  long timePortion =  (long) ((dateTimeDouble - days) * 60 * 60 * 24 * 1000);

  int zoneAndDSTOffset = tz.getOffset(datePortion);

  Date output = new Date (datePortion + timePortion - zoneAndDSTOffset);
  DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");  
  formatter.setTimeZone(TimeZone.getTimeZone(timeZoneCode)); 
  return formatter.format(output);
}

调用它的示例:

System.out.println(convertEasyIPTime (39940.1295844213d, "CST"));
于 2013-03-01T21:13:04.493 回答