]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.api.uuid/src/org/argeo/api/uuid/TimeUuid.java
Merge remote-tracking branch 'origin/merge-to-testing' into testing
[lgpl/argeo-commons.git] / org.argeo.api.uuid / src / org / argeo / api / uuid / TimeUuid.java
index 2f3a73fffc7c4cfd4af511557ef29cdfe0a18bb1..2e0587d12748128445ee3b81b64439fa8b6a59f2 100644 (file)
@@ -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;
+       }
 }