首页 > 解决方案 > 我如何从 UUID 类型 1 中获取日期/时间

问题描述

我已包含以下 UUID 库

compile group: 'com.fasterxml.uuid', name: 'java-uuid-generator', version: '3.1.5'

在我的构建中。

我有一些这样的代码

        NoArgGenerator timeBasedGenerator = Generators.timeBasedGenerator()
        UUID tuid = timeBasedGenerator.generate()
        Timestamp timestamp = new Timestamp ((tuid.timestamp()/1000) as Long)
        Date dateTime = new Date (timestamp.getTime())

但是,当我尝试查看日期时,它与应有的日期完全不同,例如uid fef57eca-7c8b-11e8-bedd-992c2ac3197a was Sun Feb 06 07:55:54 GMT 6327 ,今天是30/06/2018

有谁知道如何使用fasterxml.uuid库从基于时间的 UUID 中正确提取真实日期和时间?

但难倒

ps改为尝试这个

        UUID tuid = timeBasedGenerator.generate()
        Long t = tuid.timestamp()
        Timestamp timestamp = new Timestamp (t)
        Date dateTime = new Date (timestamp.getTime())

它给出了一个 uidff79d7d9-7cb5-11e8-976c-6ba57a5e9636和日期Thu Aug 14 11:11:40 BST 4359073

标签: javatimeuuid

解决方案


要获得完整的 100ns 精度java.util.Instant,您可以执行以下操作:

private static final long NUM_HUNDRED_NANOS_IN_A_SECOND = 10_000_000L;

private static final long NUM_HUNDRED_NANOS_FROM_UUID_EPOCH_TO_UNIX_EPOCH = 122_192_928_000_000_000L;


/**
 * Extracts the Instant (with the maximum available 100ns precision) from the given time-based (version 1) UUID.
 *
 * @return the {@link Instant} extracted from the given time-based UUID
 * @throws UnsupportedOperationException If this UUID is not a version 1 UUID
 */
public static Instant getInstantFromUUID(final UUID uuid) {
    final long hundredNanosSinceUnixEpoch = uuid.timestamp() - NUM_HUNDRED_NANOS_FROM_UUID_EPOCH_TO_UNIX_EPOCH;
    final long secondsSinceUnixEpoch = hundredNanosSinceUnixEpoch / NUM_HUNDRED_NANOS_IN_A_SECOND;
    final long nanoAdjustment = ((hundredNanosSinceUnixEpoch % NUM_HUNDRED_NANOS_IN_A_SECOND) * 100);
    return Instant.ofEpochSecond(secondsSinceUnixEpoch, nanoAdjustment);
}

推荐阅读