Vergleich zweier timestamps
Möchte ich vergleichen Sie die folgenden zwei timestamps. Sollte es wieder true
aber durch einstellige und zweistellige Millisekunden in die zwei timestamps, es ist wieder false
. Was kann ich tun, um ihn zurück true
public static void main(String[] args) throws ParseException {
String d1 = "2011-12-31 07:11:01.5";
String d2 = "2011-12-31 07:11:01.50";
SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS");
Date dateOne = s1.parse(d1);
Date dateTwo = s2.parse(d2);
System.out.println(dateOne.equals(dateTwo));
}
InformationsquelleAutor Yatendra Goel | 2012-01-07
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die anderen schon beantwortet warum. Hier ist ein Ausgangspunkt, um um ihn herum:
Ausgabe:
InformationsquelleAutor black panda
Das problem ist, dass das S-symbol analysiert zahlen als Millisekunden. Immer. Also, im ersten Fall, ".5" wird analysiert als 5 Millisekunden und ".50" wird analysiert als 50 Millisekunden. Keiner von Ihnen wird analysiert, wie eine halbe Sekunde, was ich vermute, ist, was Sie wollen.
Leider ist das ein Manko in " = SimpleDateFormat. Es gibt einfach keine Möglichkeit, zu analysieren und zu formatieren decisecond oder centisecond Felder.
Als ich den letzten hatte, dies zu tun (zugegeben, nur für eine Zeit, kein Datum), landete ich Parsen manuell Teilung der string mit einem regulären Ausdruck, dann die Umwandlung der Felder in einer Millisekunde insgesamt von hand. Könnten Sie vielleicht schneiden die Sekundenbruchteile Feld und analysieren, die manuell, dann analysieren Sie den restlichen string mit " = SimpleDateFormat.
Ist die alternative zu pad die Saiten mit nachfolgenden Nullen, so dass die Sekundenbruchteile immer drei Ziffern, die dann auch korrekt analysiert. Hässlich, aber wenigstens einfach.
InformationsquelleAutor Tom Anderson
Es ist richtig, dass
equals
zurückfalse
. Diese beiden strings unterschiedlich sind -.5
(interpretiert als.05
) kann nicht das gleiche wie.50
. Auch ist es besser, zu verwendencompareTo
wenn Sie vergleichen wollenDates
.Und ich würde nur einen
SimpleDateFormat
wie diese:Also meine Vorschläge sind:
Date
dann Sie wird anders sein, weil die nicht das gleiche..SS
Teil aus dem Muster, aber dann verlieren Sie die Präzision..InformationsquelleAutor user219882
Nur versuchen, diese (vorausgesetzt, Sie wollen nicht zu betrachten Millisekunden):
InformationsquelleAutor kosa
Scheint es, dass " = SimpleDateFormat interpretiert, der Letzte Teil als integer und nicht als Dezimalwert. Die offensichtliche Lösung ist, um sicherzustellen, gibt es immer drei Ziffern am Ende, und rechts pad mit 0, wenn nicht.
Verwenden Sie dann das Muster
yyyy-MM-dd HH:mm:ss.SSS
analysieren..SS
.Es spielt keine Rolle, was Sie verwenden für die Analyse
ss.S
oderss.SSS
es wird nur für die Formatierung verwendet. Sehen, die als Teil des javadoc-ich zitierte in meiner AntwortSie verpasste den Teil, wenn ich Ihnen sage, zu Recht-pad-string mit Nullen aufgefüllt, um sicherzustellen, gibt es immer drei Ziffern.
Es ist nicht der Mühe Wert. Ich würde nicht empfehlen, diese Art der one-purpose-Lösung mit extra-code, damit es funktioniert.
InformationsquelleAutor JB Nizet
Finden Sie in der javadoc der
" = SimpleDateFormat
:Damit Ihre
.S
und.SS
in IhremSimpleDateFormat
- Konstruktion sind nur für die Formatierung verwendet, nicht für die Analyse. Dieequals
check gibt false zurück, da diegetTime
Wert ist, unterscheiden sich die beiden, als Dokument in der dieequals
Methode derDate
Klasse. Fürd1
es sieht 5 Millisekunden und fürd2
50 Millisekunden.Daher mit
SimpleDateFormat
diese beiden Instanzen werden nie gleich sein. Sie konnten entscheiden, ignorieren Sie die Millisekunden oder, wenn möglich, passen Sie die Eingabe-Strings.InformationsquelleAutor Robin