2013-02-26 82 views
1

我需要轉換從Easy-IP提取的XML數據中的某些日期+時間戳。我不認識原始值,它們看起來像是一個浮點值,但對於UNIX風格,整個數字部分太小。從浮點(EasyIP)計算可讀的時間戳嗎?

我可能會再次遇到這種類型的系統提取的數據,所以我想有一個標準的轉換方式,不依賴於直接訪問數據庫(可能不同或無法訪問)

我相信,後端數據庫是火鳥,而是根據自己的文檔後,便開始從1月1日計數,1753

一些樣本值(每行是不同的實體),這應該都是指到過去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

我的猜測是值來自內部的Delphi TDateTime表示:

的Delphi程序內部表示TDateTime類型值作爲一個浮點值,積分部分表示自DEC-30-1899和分數的天數部分是自午夜以來的一小部分時間。

因此,例如,

  • 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; 

如果你沒有手頭有德爾福,有other tools其使用類似的表示,你現在所有的信息自己做數學如果你運氣不好。轉換到UnixTime並不是特別困難。

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"));