如何使用javascript从UUID v1(TimeUUID)中提取时间戳?

时间:2013-07-10 12:50:42

标签: node.js cassandra uuid helenus

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

4 个答案:

答案 0 :(得分:11)

此lib( 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'

答案 1 :(得分:8)

您可以在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来实现该代码。

答案 2 :(得分:0)

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

Commit with function for extract msecs from uuid v1

答案 3 :(得分:0)

使用uuid-time模块。

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

相关问题