2013-03-01 82 views
1

我試圖從一個十六進制序列中提取時間戳的數據,我已經收窄,其中時間戳是隱藏確定時間戳數據

我發現兩個日期由約是關閉的十六進制數據2分鐘

(2012-12-01 06:00:55 -0700) 
A4 01 1B FE 36 05 88 23 E4 40 

(2012-12-01 06:02:56 -0700) 
A4 01 EF F9 AF 10 88 23 E4 40 

(2012-12-01 06:00:49 -0700) 
A4 01 67 5B A5 04 88 23 E4 40 

(2012-12-02 06:00:47 -0700) 
A4 01 D6 CF 74 04 A8 23 E4 40 

多個時間戳

A4 01 90 A1 B2 03 C8 2E E4 40 
A4 01 22 2D E3 03 C8 2E E4 40 
-0800 
E0 01 FF 15 82 03 C8 2E E4 40 

我敢肯定的基礎上,我能夠被日起取消其參賽資格一些其他的數據,它是使用littl e endian編碼

但是,就我所能得到的這一點而言。我正在使用此網站http://fmdiff.com/fm/timestamp.html將知道的時間戳轉換爲一些常見的格式,但我只是沒有看到它。

是否有任何其他格式(可能在.net中),我可以嘗試此信息正在使用?


解決了,感謝@Markus

下面是轉換(LE)六角

#include <Debug.au3> 
#include <Date.au3> 

_DebugSetup("Debug") 

Func GetExcelTimestamp($dec) 
    $excel_time = Dec($dec,3) 
    $timeinms = ($excel_time-25569)*24*3600*1000 
    $sTime = _DateAdd("s", Int($timeinms/1000), "1970/01/01 00:00:00") 

    _DebugOut($dec & " - " & $sTime) 
    Return $sTime 
EndFunc ;==>GetExcelTimeDate 


GetExcelTimestamp("40E423880536FE1B") 
GetExcelTimestamp("40E4238810AFF9EF") 
GetExcelTimestamp("40E4238804A55B67") 
GetExcelTimestamp("40E423A80474CFD6") 
+1

嗨丹尼爾,你有更多的示例日期,你可以發佈?這樣我們可以嘗試做一個線性擬合,這可能會讓你更清楚你在這裏處理的是什麼。不幸的是,從這兩個數字,我什麼也沒有看到。他們應該相差大約121,000毫秒,但是我找不到那個數字的區別... – 2013-03-05 07:02:08

+0

又添加了2個時間戳,我會盡量在不同的日子添加更多的時間戳。我也遇到過這篇文章:http://blogs.msdn.com/b/oldnewthing/archive/2003/09/05/54806.aspx,這是在談論「如果它是一個以」01開頭的64位值「和一封信,它可能是一個Win32 FILETIME。 「01A」時代始於1972年,我認爲這些值應該以兩個字節讀取,其值相反,因此「A4 01」將是「01 A4」。還要注意日差(最後一項是12-02,顯示爲23A8而不是2388) – Daniel 2013-03-06 00:45:11

回答

3

這裏的Java代碼將讀取的日期(說明如下)代碼:

//------------------------------------------------------------------------------- 
// Convert from hex to usable date value 

long temp = 0x40E423880536FE1BL; // Decode 64-bit little endian (backwards) hex 
//long temp = 0x40E4238810AFF9EFL; // example 2 
//long temp = 0x40E4238804A55B67L; // example 3 
//long temp = 0x40E423A80474CFD6L; // example 4 

double excel_time = Double.longBitsToDouble(temp); // days since 1/1/1900 

//------------------------------------------------------------------------------- 
// Convert to something that Java can handle and output in correct timezone 

long java_time = (long) ((excel_time-25569)*24*3600*1000); // ms since 1/1/1970 
Date date = new Date(java_time); 

SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss"); 
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT")); // don't change timezone 
System.out.println(dateFormatGmt.format(date)); 

日期以自1900年1月1日以來的天數(the way Excel stores them)存儲,轉換爲h ex你從Double precision floating point小尾數格式,你猜對了。您在開始時包含的A4 01可能不是日期的一部分。

您的日期存儲在您發佈的時區(GMT-7),而不是UTC。

注:

這可能是該A4 01是數字一部分,如果是一些其他的浮點格式,如80位擴展格式。但是,鑑於它在你的4個例子中是相同的,我寧可認爲它不是。

+0

感謝您關注此Markus。我很感激幫助。我能夠獲得更多的時間戳數據,包括來自不同的時區,看起來就是這樣的A4 01 waas – Daniel 2013-03-06 16:27:53

+0

嗯....新的時間戳不適用於我的代碼。對他們來說,我分別獲得了「2013年3月1日06:00:38」,「2013年3月1日06:00:41」和「2013年3月1日06:00:36」。很奇怪。你確定這些是正確的嗎? ;)因爲數據格式聽起來很合理...... – 2013-03-06 17:53:18

+0

我認爲你是對的,我必須把它們弄錯了......我的意思是 - 你已經通過了測試:) – Daniel 2013-03-06 17:58:52