这是什么时间格式,我如何将其转换为时代?

我有两种格式的时间戳数据,其中3F536DDA -> 13783970857680003F52C3C3 -> 1378353476238000 。 我似乎无法弄清楚3F536DDA格式,也不知道如何将其转换为有问题的时代。 任何帮助,将不胜感激!

更新

我发现这个:

自1980年1月6日00:00:00 GMT以来,以秒为单位的8位hex表示。

这似乎是GPS时间。

我可能会错过这里的转换,我只是减去1980年1月6日和1970年1月1日之间的差异。

 time = (1378397085 - 315964800) console.log '3F536DDA' # What I expected console.log time.toString(16) # What I get: 3F536D1D 

       

网上收集的解决方案 "这是什么时间格式,我如何将其转换为时代?"

那么,这些看起来就像hex数字,这将是自1970年1月1日以来的秒数。

 3F536DDA hex == 1062432218 dec == Mon, 01 Sep 2003 16:03:38 GMT 3F52C3C3 hex == 1062388675 dec == Mon, 01 Sep 2003 03:57:55 GMT 

其他的数字看起来像自1970年1月1日以来的十进制微秒 ,但它们不等于那些其他数字:

 1378397085768000 == Thu, 05 Sep 2013 16:04:45 GMT 1378353476238000 == Thu, 05 Sep 2013 03:57:56 GMT 

如果这些不是你想到的date,那么还有一些其他的时代。 例如,如果它们起源于Microsoft Windows,则肯定会有所不同。

你从哪里弄到的? 这些知识将有助于他们的解释。

UPDATE

既然你说他们是基于1980年1月6日的时代,那么你可以做这样的事情:

 var d = new Date(Date.UTC(1980,0,6) + parseInt('3F536DDA', 16) * 1000); d.toISOString(); // 2013-09-05T16:03:38.000Z 

或者更好的是,使用moment.js

 var m = moment.utc("1980-01-06").add('seconds', parseInt('3F536DDA', 16)); m.toISOString(); // 2013-09-05T16:03:38.000Z 

你可能会认为这只是在GPS时代(1980年1月6日午夜)和Unix时代(1970年1月1日午夜)之间进行区分而已。 这个答案会让你接近,但不准确,因为GPS时间不考虑闰秒。 自1980年以来,每增加一个闰秒,计算就会出现偏差。

我写了一个助手库,你可以在这里使用: https : //github.com/davidcalhoun/gps-time.js

如果你感兴趣的话,algorithm本质上是这样的:1)从GPS转换到Unix时代2)任何给定的date,确定已添加的闰秒的数量3)根据已经过去了多less闰秒进行时间调整

为了使这个工作在任意的时间,包括过去的时间,这基本上需要通过查找表遍历闰秒的所有确切时间。

重要的是,这也意味着为了防止漂移,将来每增加一次闰秒就需要更新代码。 幸运的是,将闰秒添加到查找表中一样简单!