将Unix时间戳转换为长原始时间戳值



unix时间戳作为NumberLong(1385297660000000000)存储在数据库(mongodb)中。当检索时间戳时,Chrome的开发者控制台将其显示为:

timestamp: Object
    _bsontype: "Long"
        high_: 322539745
        low_: -2018573312

如何检索原始unix时间戳?

您也可以使用这种快速方式:

longToDate = function(longValue) {
    var high = longValue._bsontype.high_;
    var low = longValue._bsontype.low_;
    return new Date(((high >>> 0) * Math.pow(16,8) + (low >>> 0))/Math.pow(10,6))
}

然后使用它,例如与timestamp 一起使用

longToDate(timestamp)
=> Sun, 24 Nov 2013 12:54:18 GMT

这感觉有些过头了,但这很有效:

  1. 去获取Long.js库
  2. 将库的Long.min.js放入Meteor项目的/lib文件夹中,以便客户端和服务器都可以使用Long对象(如果需要;否则,根据需要将其放入/client/lib/server/lib中)
  3. 根据文档,使用以下代码;甚至可以在客户端工作:

(参见此处的工作示例)

var Long, value, unixTimestamp, jsTimestamp, date;
Long = dcodeIO.Long;
value = new Long(-2018573312, 322539745).toNumber();
// 1385297658711573500, almost the original 1385297660000000000
// Unix timestamps are in seconds, so lop off the last 9 digits
unixTimestamp = Math.round(value / 1000000000);
// 1385297659
// JavaScript timestamps are in milliseconds, so lop off the last 6 digits
jsTimestamp = Math.round(value / 1000000);
// 1385297658712
// Create Date object (if desired)
date = new Date(jsTimestamp);
// Sun Nov 24 2013 07:54:18 GMT-0500 (EST)

因此,如果您真的想要Unix时间戳,请参阅上面的unixTimestamp变量;或者我假设您可能更喜欢JavaScript Date()对象,在这种情况下使用上面的date变量。您所需要做的就是将时间戳对象的低值和高值放入我在该代码中放置-2018573312322539745的位置。请注意,这两个时间戳都不完全等于原始的138529766 Unix时间戳;在输入和输出Long数字类型时会丢失一些精度。

最新更新