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

3

一个Unix时间戳以NumberLong(1385297660000000000)的形式存储在数据库(mongodb)中。当检索时间戳时,Chrome开发者控制台显示为:

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

如何检索原始Unix时间戳?


可能是重复的问题:如何使用Node.js从Mongodb中提取NumberLong数据? - raina77ow
@raina77ow,情况与MongoDB不同,因为Meteor使用自己的_id对象。 - Tarang
Nyxynyx,这些是从另一个非Meteor应用程序插入的吗? - Tarang
@Tarang:这些数据是通过Python插入到mongodb中的。将Long对象转换为Unix时间戳的好方法是什么? - Nyxynyx
我刚刚发布了一个答案,但是又想到了另一个想法:MongoDB专家们,是否可以将 "NumberLong(1385297660000000000)" 从数据库中检索出来作为字符串?如果可以,那么答案只需要一行代码:对于Unix时间戳,使用 Math.round(parseInt("NumberLong(1385297660000000000)".match(/(\d+)/)[0]) / 1000000000),对于JavaScript日期对象,使用 new Date(parseInt("NumberLong(1385297660000000000)".match(/(\d+)/)[0]) / 1000000) - Geoffrey Booth
2个回答

2
您也可以使用以下快捷方式:

您也可以使用以下快捷方式:

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

0

感觉有点过度,但这样做是可行的:

  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类型数字时会有一些精度损失。


请原谅我,但如果您想要秒而获得JS毫秒,难道不应该除以1000而不是1000000吗? - johnbakers
如果你试图在JS时间戳和Unix时间戳之间进行转换,是的,需要除以或乘以1000。但上述示例中value变量不是这两者之一,而是一个更长的整数。它的值在第4行的注释中,随后的注释显示了unixTimestampjsTimestampdate的结果值。value的值永远不会改变。尝试使用fiddle(链接在示例代码上面),你可以看到它的实际效果。 - Geoffrey Booth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接