2013-03-02 22 views
13

Wie konvertiert man das UUID in das Datumsformat 2011-04-22?Wie extrahiere ich ein Datum aus einer UUID mit Java?

Zum Beispiel, ich habe UUID wie diese

118ffe80-466b-11e1-b5a5-5732cf729524. 

Wie dieses Format auf dem Laufenden konvertieren?

Ich versuche

String uuid="118ffe80-466b-11e1-b5a5-5732cf729524"; 
    UUID uid = UUID.fromString(uuid); 
    long ls=convertTime(uid.timeStamp()); // it returns long value 

    public String convertTime(long time){ 
      System.out.println("====="+time); 
      Date date = new Date(time); 
      Format format = new SimpleDateFormat("yyyy/MM/dd"); 
      return format.format(date).toString(); 
     } 

Ausgang Ich habe: 4294744/11/02

Gleichen Fall funktioniert gut für Perl

$uuid='ef802820-46b3-11e2-bf3a-47ef6b3e28e2'; 
$uuid =~ s/-//g; 

my $timelow = hex substr($uuid, 2 * 0,  2 * 4); 
my $timemid = hex substr($uuid, 2 * 4,  2 * 2); 
my $version = hex substr($uuid, 2 * 6,  1); 
my $timehi = hex substr($uuid, 2 * 6 + 1, 2 * 2 - 1); 

my $time = ($timehi * (2**16) + $timemid) * (2**32) + $timelow; 
my $epoc = int($time/10000000) - 12219292800; 
my $nano = $time - int($time/10000000) * 10000000; 

#$time_date = scalar localtime $epoc; 
#print strftime('%d-%m-%Y %H:%M:%S', localtime($epoc)); 
#print "\n Time: ", scalar localtime $epoc, " +", $nano/10000, "ms\n"; 
+0

bitte überprüfen Sie mit dieser URL http://stackoverflow.com/questions/15127648/how-do-we-convert-uuid-to-date-in-perl – BALASCJP

+0

Wissen Sie, ob diese Quelle UUID eine V1 UUID ist? – Joe

+0

'timeStamp()' gibt einen Zeitstempel zurück, der seit Mitternacht, 15. Oktober 1582 UTC in 100-Nanosekunden-Einheiten gemessen wurde; 'Date (long date)' erwartet Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT. Sie müssen also von einem Format in das andere umwandeln – tmuguet

Antwort

13

Die javadoc für UUID sagen die folgende über das Zeitstempelfeld:

Der 60-Bit-Zeitstempelwert wird aus den Feldern time_low, time_mid und time_hi dieser UUID aufgebaut. Der resultierende Zeitstempel wird in 100-Nanosekunden-Einheiten seit Mitternacht, 15. Oktober 1582 UTC gemessen.

(Hervorhebung von mir)

Die Java-Zeitstempel in Millisekunden seit dem 1970-01-01. Um ein aussagekräftiges Datum von einer UUID zu erhalten, müssen Sie zwei Dinge tun: Konvertieren von 100ns in 1ms Genauigkeit (dividieren durch 10000) und Rebasieren von 1582-10-15 auf 1970-01-01, was Sie tun können indem Sie einen konstanten Wert hinzufügen.

WolframAlpha tells us, die 1582.10.15 auf einem UNIX-Zeitstempel von -12219292800 entspricht, so das richtige Datum zu bekommen, Sie 12219292800 auf die Anzahl der Millisekunden müssen hinzufügen bekam man nach 10000.

Als Randbemerkung durch Dividieren :

Der Wert Zeitstempel ist nur sinnvoll, in einer zeitbasierten UUID, die 1. Version Typ hat ist diese UUID kein zeitbasierte ist UUID dann diese Methode UnsupportedOperationException wirft.

... also stellen Sie sicher, dass Ihr Code entweder nur UUIDs vom Typ 1 trifft oder dass er keine Zeitstempel hat.

+0

Dank Barend kann ein einfaches Beispiel geben. – BALASCJP

+1

Sie meinen 'neues Datum (uid.timeStamp()/10000L + 12219292800L)'? Ich könnte Ihnen ein Beispiel geben, aber ich bin sicher, dass Sie es herausfinden können :). – Barend

+0

ya sicher danke ... – BALASCJP

Verwandte Themen