X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.api.uuid%2Fsrc%2Forg%2Fargeo%2Fapi%2Fuuid%2FTimeUuid.java;h=2e0587d12748128445ee3b81b64439fa8b6a59f2;hb=369abbec35158f11bcca3651c1c3f2f7d6652226;hp=2f3a73fffc7c4cfd4af511557ef29cdfe0a18bb1;hpb=e8e2c65f356b30b35e4d8a1de66691a789c183bb;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.api.uuid/src/org/argeo/api/uuid/TimeUuid.java b/org.argeo.api.uuid/src/org/argeo/api/uuid/TimeUuid.java index 2f3a73fff..2e0587d12 100644 --- a/org.argeo.api.uuid/src/org/argeo/api/uuid/TimeUuid.java +++ b/org.argeo.api.uuid/src/org/argeo/api/uuid/TimeUuid.java @@ -18,6 +18,7 @@ public class TimeUuid extends TypedUuid { */ public final static Instant TIMESTAMP_ZERO = ZonedDateTime.of(1582, 10, 15, 0, 0, 0, 0, ZoneOffset.UTC).toInstant(); + /** Constructor based on a {@link UUID}. */ public TimeUuid(UUID uuid) { super(uuid); if (uuid.version() != 1 && uuid.variant() != 2) @@ -75,4 +76,23 @@ public class TimeUuid extends TypedUuid { Duration duration = Duration.between(TimeUuid.TIMESTAMP_ZERO, instant); return durationToTimestamp(duration); } + + /** + * Crate a time UUID with this instant as timestamp and clock and node id set to + * zero. + */ + public static UUID fromInstant(Instant instant) { + long timestamp = instantToTimestamp(instant); + long mostSig = toMostSignificantBits(timestamp); + UUID uuid = new UUID(mostSig, UuidFactory.LEAST_SIG_RFC4122_VARIANT); + return uuid; + } + + /** Convert timestamp in UUID format to most significant bits of a time UUID. */ + static long toMostSignificantBits(long timestamp) { + long mostSig = UuidFactory.MOST_SIG_VERSION1 | ((timestamp & 0xFFFFFFFFL) << 32) // time_low + | (((timestamp >> 32) & 0xFFFFL) << 16) // time_mid + | ((timestamp >> 48) & 0x0FFFL);// time_hi_and_version + return mostSig; + } }