get the unix timestamp from type 1 uuid

2020-03-26 05:22发布

In our java application we are trying to get the unix time from the type 1 uuid. But its not giving the correct date time values.

long time = uuid.timestamp();
time = time / 10000L; // Dividing by 10^4 as its in 100 nanoseconds precision 
Calendar c = Calendar.getInstance();
c.setTimeInMillis(time);
c.getTime();

Can some one please help ?

Edit: Fixed the divisor(10^4)

4条回答
Animai°情兽
2楼-- · 2020-03-26 05:53

In my case, the following code worked.

    final long NUM_100NS_INTERVALS_SINCE_UUID_EPOCH = 0x01b21dd213814000L;
    UUID uuid = UUID.fromString("6470d760-d93d-11e9-8b32-858313a776ba");
    long  time = (uuid.timestamp() - NUM_100NS_INTERVALS_SINCE_UUID_EPOCH) / 10000;
    // Rest of code as before
查看更多
女痞
4楼-- · 2020-03-26 06:04

From the docs for timestamp():

The resulting timestamp is measured in 100-nanosecond units since midnight, October 15, 1582 UTC.

So you need to offset it from that. For example:

Calendar uuidEpoch = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
uuidEpoch.clear();
uuidEpoch.set(1582, 9, 15, 0, 0, 0); // 9 = October
long epochMillis = uuidEpoch.getTime().getTime();

long time = (uuid.timestamp() / 10000L) + epochMillis;
// Rest of code as before
查看更多
可以哭但决不认输i
5楼-- · 2020-03-26 06:04

In the case someone else needs it:

long milliseconds = UuidUtil.extractUnixMilliseconds(uuid);

https://github.com/f4b6a3/uuid-creator

查看更多
登录 后发表回答