一个Unix时间戳以NumberLong(1385297660000000000)
的形式存储在数据库(mongodb)中。当检索时间戳时,Chrome开发者控制台显示为:
timestamp: Object
_bsontype: "Long"
high_: 322539745
low_: -2018573312
如何检索原始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))
}
时间戳
一起使用。longToDate(timestamp)
=> Sun, 24 Nov 2013 12:54:18 GMT
感觉有点过度,但这样做是可行的:
Long.min.js
放入Meteor项目的/lib
文件夹中,以便Long对象可供客户端和服务器使用(如果需要;否则根据需要放入/client/lib
或/server/lib
)(查看工作示例此处)
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
变量。你所需要做的就是将你的时间戳对象的低位和高位值放到我在这段代码中放置的-2018573312
和322539745
位置。请注意,这两个时间戳都不完全等于原始的138529766 Unix时间戳;进出Long类型数字时会有一些精度损失。
value
变量不是这两者之一,而是一个更长的整数。它的值在第4行的注释中,随后的注释显示了unixTimestamp
、jsTimestamp
和date
的结果值。value
的值永远不会改变。尝试使用fiddle(链接在示例代码上面),你可以看到它的实际效果。 - Geoffrey Booth
"NumberLong(1385297660000000000)"
从数据库中检索出来作为字符串?如果可以,那么答案只需要一行代码:对于Unix时间戳,使用Math.round(parseInt("NumberLong(1385297660000000000)".match(/(\d+)/)[0]) / 1000000000)
,对于JavaScript日期对象,使用new Date(parseInt("NumberLong(1385297660000000000)".match(/(\d+)/)[0]) / 1000000)
。 - Geoffrey Booth