我需要在从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转换为日期+时间戳,则可获得奖励。
答案 0 :(得分:2)
我的猜测是来自内部Delphi TDateTime表示的值:
Delphi程序在内部将TDateTime值表示为浮点值,积分部分表示自Dec-30-1899之后的天数,小数部分是自午夜以来的一小部分。
所以,例如,
39660
是Jul-31-2008
0.2632087847
是6: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"));