【问题标题】:How to extract timestamp from UUID v1 (TimeUUID) using javascript?如何使用 javascript 从 UUID v1 (TimeUUID) 中提取时间戳?
【发布时间】:2013-07-08 09:50:18
【问题描述】:

我使用 Cassandra DB 和 Helenus 模块 for nodejs 来操作这个。我有一些包含 TimeUUID 列的行。如何在 JavaScript 中从 TimeUUID 获取时间戳?

【问题讨论】:

  • 我猜你可以直接从row.forEach获取时间戳。
  • 不幸的是我不能在这种情况下。我在 CF 中有这样的结构:timestamp_[user_key]:{timeUUID:'JSON_DATA',timeUUID:'JSON_DATA'...}。所以 ts var in row.forEach(function(name,value,ts,ttl) 包含 timestamp_[user_key] 行的创建日期的时间戳。

标签: node.js cassandra uuid helenus


【解决方案1】:

这个库(UUID_to_Date)非常简单快速!!仅使用本机 String 函数。 也许这个 Javascript API 可以帮助您将 UUID 转换为日期格式, Javascript 是一种简单的语言,这个简单的代码可以帮助编写每种语言的 API。

此 API 将 UUID v1 转换为 1970-01-01 的秒



你们都需要:

    get_time_int = function (uuid_str) {
        var uuid_arr = uuid_str.split( '-' ),
            time_str = [
                uuid_arr[ 2 ].substring( 1 ),
                uuid_arr[ 1 ],
                uuid_arr[ 0 ]
            ].join( '' );
        return parseInt( time_str, 16 );
    };

    get_date_obj = function (uuid_str) {
        var int_time = this.get_time_int( uuid_str ) - 122192928000000000,
            int_millisec = Math.floor( int_time / 10000 );
        return new Date( int_millisec );
    };


示例:

    var date_obj = get_date_obj(  '8bf1aeb8-6b5b-11e4-95c0-001dba68c1f2' );
    date_obj.toLocaleString( );// '11/13/2014, 9:06:06 PM'

【讨论】:

  • 谢谢。对于这个特定的 uuid,我得到了 "13.11.2014, 18:36:06"
  • 注意,uuid 必须是版本 1;使用函数 get_uuid_version(uuid_str) { var uuid_arr = uuid_str.split( '-' ) var timeHiAndVersion = parseInt(uuid_arr[ 2 ], 16) 进行测试; var 版本 = (timeHiAndVersion >> 12) & 0xF;返回版本; }
【解决方案2】:

您可以使用 CQL3 中的 unixTimestampOfdateOf 函数,或者您可以自己做,很难:

时间被编码到 UUID 的前 64 位中,但它与其他一些部分交错,因此提取时间并不是非常简单。

如果nTimeUUID 的整数表示,那么您可以像这样提取UNIX 纪元:

n = (value >> 64)
t = 0
t |= (n & 0x0000000000000fff) << 48
t |= (n & 0x00000000ffff0000) << 16
t |= (n & 0xffffffff00000000) >> 32
t -= 122192928000000000
seconds = t/10_000_000
microseconds = (t - seconds * 10_000_000)/10.0

这段代码来自我的 Ruby CQL3 驱动程序 cql-rb,可以在这里找到完整的代码:https://github.com/iconara/cql-rb/blob/master/lib/cql/time_uuid.rb

我使用了这个资源:http://www.famkruithof.net/guid-uuid-timebased.html,以及 RFC 来实现该代码。

【讨论】:

  • 所以,为了使用 JS 将 TimeUUID(例如 aa009299-0c22-47c0-9cd4-aa518f0274a7)转换为时间戳,我需要先将 uuid 转换为整数表示......对吗?该怎么做?
【解决方案3】:

使用uuid-time 模块。

我在这里询问了 uuid 模块的维护人员 https://github.com/kelektiv/node-uuid/issues/297,他们将我指向了 uuid-time 模块 https://www.npmjs.com/package/uuid-time

【讨论】:

  • 这应该是现在的正确答案。感谢您实际发布了一个无需额外依赖的节点模块。
【解决方案4】:

nodejs 的 node-uuid 模块包含将 uuid v1 转换为时间戳的方法

Commit with function for extract msecs from uuid v1

【讨论】:

  • 你没有提出拉取请求?
  • 我是否对已添加的功能提出了拉取请求?不,我没有
  • 添加了?方法的名称是什么?
  • v1time()你点击了回答中的链接吗?
  • 是的,但是方法只添加在你的fork中不是吗?这就是为什么我要问你是否提出了拉取请求。据我所知,node-uuid 包中没有 v1time。
猜你喜欢
  • 1970-01-01
  • 2016-09-26
  • 2016-10-06
  • 2015-01-10
  • 2016-08-10
  • 2012-10-15
  • 1970-01-01
  • 2020-07-07
  • 2019-06-10
相关资源
最近更新 更多