从浮点(EasyIP)计算人类可读时间戳?

时间:2013-02-26 07:39:24

标签: xml firebird

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

我可能会再次从这种类型的系统中遇到提取的数据,所以我希望有一种标准的转换方式,不依赖于直接访问数据库(可能是不同的或不可访问的)< / p>

我认为后端数据库是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转换为日期+时间戳,则可获得奖励。

2 个答案:

答案 0 :(得分:2)

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

Delphi程序在内部将TDateTime值表示为浮点值,积分部分表示自Dec-30-1899之后的天数,小数部分是自午夜以来的一小部分。

所以,例如,

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

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

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

有了这一切,看起来最简单的转换日期的方法是在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,other tools会使用类似的表示形式,如果运气不好,您现在可以自行获取所有数据信息。转换到UnixTime并不是特别困难。

答案 1 :(得分: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"));