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

15

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


1
我猜你可以直接从 row.forEach 中获取时间戳。 - adrianp
很遗憾,在这种情况下我不能这样做。我在CF中有这样的结构:timestamp_[user_key]:{timeUUID:'JSON_DATA',timeUUID:'JSON_DATA'...}。因此,row.forEach(function(name,value,ts,ttl)中的ts变量包含timestamp_[user_key]行创建日期的时间戳。 - Vadim
4个回答

26

这个库(UUID_to_Date)非常简单和快速!!只使用了原生字符串函数。也许这个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,我得到了“2014年11月13日,18:36:06”。 - Eric Duminil
1
请注意,uuid 必须是版本 1;使用以下测试函数:function get_uuid_version(uuid_str) { var uuid_arr = uuid_str.split( '-' ) var timeHiAndVersion = parseInt(uuid_arr[ 2 ], 16); var version = (timeHiAndVersion >> 12) & 0xF; return version; } - Steve Oh

9
你可以在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
那么,要使用JS将TimeUUID(例如aa009299-0c22-47c0-9cd4-aa518f0274a7)转换为时间戳,我需要先将uuid转换为整数表示形式...对吗?如何做到这一点? - Vadim

7

这现在应该是正确的答案。感谢您实际发布了一个不需要额外依赖的节点模块来完成它。 - zenbeni

4

你没有为此提交拉取请求? - Sam
我是否为已添加的功能发起了拉取请求?没有,我没有。 - Vadim
已经添加了吗?方法的名称是什么? - Sam
v1time() 你有点击答案中的链接吗? - Vadim
7
是的,但这种方法只在你的分支中添加了,是吗?这就是我问你是否已经发起了拉取请求的原因。据我所知,在node-uuid包中并没有v1time。 - Sam
显示剩余2条评论

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