【问题标题】:Convert Unix Timestamp in Long original Timestamp value将 Unix 时间戳转换为 Long 原始时间戳值
【发布时间】:2013-12-09 10:13:39
【问题描述】:

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

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

如何检索原始 unix 时间戳?

【问题讨论】:

  • @raina77ow 这种情况与 mongodb 不同,因为流星使用自己的 _id 对象。
  • Nyxynyx 这些是从另一个非流星应用插入的吗?
  • @Tarang:这些是从 Python 插入到 mongodb 中的。将 Long 对象转换为 unix 时间戳的好方法是什么?
  • 我刚刚发布了一个答案,但我想到了另一个想法:MongoDB专家,是否可以从数据库中检索"NumberLong(1385297660000000000)"作为强项?如果是这样,答案是单行的:Math.round(parseInt("NumberLong(1385297660000000000)".match(/(\d+)/)[0]) / 1000000000) 用于 Unix 时间戳,或 new Date(parseInt("NumberLong(1385297660000000000)".match(/(\d+)/)[0]) / 1000000) 用于 JavaScript Date 对象。

标签: javascript jquery node.js mongodb meteor


【解决方案1】:

感觉有点矫枉过正,但这行得通:

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

(参见工作示例here

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 吗?
  • 如果您尝试在 JS 时间戳和 Unix 时间戳之间进行转换,是的,除以或乘以 1000。在上面的示例中,虽然 value 变量既不是,而是一个多 -更长的整数。它的值在第 4 行的注释中,随后的 cmets 会显示unixTimestampjsTimestampdate 的结果值。 value 的值永远不会改变。试试小提琴(示例代码上方的链接),您可以看到它的实际效果。
【解决方案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))
}

然后只需将它与您的timestamp一起使用即可

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

【讨论】:

    猜你喜欢
    • 2013-04-07
    • 2020-10-19
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多