2013-03-01 91 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