Java: die Berechnung der Dauer
Habe ich den folgenden code, um die Berechnung der Dauer zwischen zwei timestamps, die sich in zwei verschiedenen Formaten:
public class dummyTime {
public static void main(String[] args) {
try {
convertDuration("2008-01-01 01:00 pm - 01:56 pm");
convertDuration("2008-01-01 8:30 pm - 2008-01-02 09:30 am");
} catch (Exception e) {
e.printStackTrace();
}
}
private static String convertDuration(String time) throws Exception {
String ts[] = time.split(" - ");
SimpleDateFormat formatNew = new SimpleDateFormat("HH:mm");
Date beg, end;
String duration = null;
beg = getDateTime(ts[0]);
end = getDateTime(ts[1], beg);
duration = formatNew.format(end.getTime() - beg.getTime());
System.out.println(duration + " ///" + time + " ///" + beg + " ///"
+ end);
return duration;
}
private static Date getDateTime(String dateTime) throws ParseException {
DateFormat formatOldDateTime = new SimpleDateFormat(
"yyyy-MM-dd hh:mm aa");
DateFormat formatOldTimeOnly = new SimpleDateFormat("hh:mm aa");
Date date = null;
try {
date = formatOldDateTime.parse(dateTime);
} catch (ParseException e) {
date = formatOldTimeOnly.parse(dateTime);
}
return date;
}
private static Date getDateTime(String dateTime, Date orig)
throws ParseException {
Date end = getDateTime(dateTime);
if (end.getYear() == 70) {
end.setYear(orig.getYear());
end.setMonth(orig.getMonth());
end.setDate(orig.getDate());
}
return end;
}
}
Die Ausgabe, die es erzeugt, ist:
01:56 ///2008-01-01 01:00 pm - 01:56 pm ///Tue Jan 01 13:00:00 CET 2008 ///Tue Jan 01 13:56:00 CET 2008
14:00 ///2008-01-01 8:30 pm - 2008-01-02 09:30 am ///Tue Jan 01 20:30:00 CET 2008 ///Wed Jan 02 09:30:00 CET 2008
Meine Fragen sind:
- Warum sind die Ergebnisse immer falsch
(immer +1h)? - Was ist besser
Weg zu identifizieren, ohne Zeitstempel
Tag? == 70 sieht nicht gut aus und die
getDay & setDay Funktionen sind
veraltet auch.
Vielen vielen Dank, dieses Problem hat mich verrückt wurde für mehrere Stunden.
Die Eingänge sind inkonsistent. Die meisten der Zeit-von-Tag-Werte haben eine Polsterung null, aber
8:30 pm
lässt.InformationsquelleAutor MrG | 2009-01-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bei meinem computer, dieser ist von 2 Stunden, denn ich bin bei GMT+2, und du bist wahrscheinlich auf GMT+1. Beachten Sie, dass
formatNew.format(end.getTime() - beg.getTime());
erhält Datum, d.h. behandelt Ihre 56 Minuten als 1970-01-01-00:56:00 GMT+1. Um dies zu beheben schnell, rufen SieformatNew.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
Für die 2. Sache, können Sie prüfen, ob format yyyy-MM-dd fehlgeschlagen (Sie fangen einen parse error), und dies ist, wie Sie wissen, dass es kein Jahr.
InformationsquelleAutor Yoni Roit
Du die Formatierung mal der Tag, nicht die Anzahl der Stunden und Minuten. Sie sind in der Zeitzone MEZ [Mitteleuropäische Zeit] im winter, das ist eine Stunde von UTC abweicht ("GMT").
Werden Sie wahrscheinlich wollen, um mit
Calendar
stattDate
. Oder Joda-Time.InformationsquelleAutor Tom Hawtin - tackline
Einfache Antwort: es ist nicht angebracht, zu verwenden " = SimpleDateFormat zum formatieren der Werte, die repräsentieren die Zeit des Tages, ohne Datum.
Längere Antwort: Java-Zeit-Werte sind die eine Anzahl von Millisekunden seit Beginn der "Epoche": Mitternacht 1. Januar 1970, UTC.
"=SimpleDateFormat geht davon aus, dass Sie geben Sie einen gültigen Zeitstempel, und gilt eine lokalisierte Umwandlung in ein Datum und eine Zeit. Ich vermute, dass Ihr Gebietsschema ist eine Stunde von GMT (kontinental-Europa), so dass ist, warum Sie sehen, Ergebnisse, die sind eine Stunde aus.
Während Sie könnte täuschen " = SimpleDateFormat durch die Einstellung der Zeitzone GMT, sind Sie wahrscheinlich besser dran, Anzeige von Dauer, explizite Mathematik:
InformationsquelleAutor kdgregory
Ersten, Ihrem Beispiel zu strings sind nicht konsistent:
8:30 pm
fehlt eine Polsterung null. Ich gehe davon aus, dass ist ein Tippfehler und sollte08:30 pm
.Unerwünscht string-Formate
Durch die Art und Weise, diese input-string-Formate sind nicht erwünscht.
- Ein viel besserer Weg ist die Verwendung von standard - ISO 8601 Formate.
- 12-Stunden-Uhren mit AM/PM sind lästig. Der standard-Formate verwenden Sie die 24-Stunden-Uhr, mit Stunden 0-23.
- Die standard-notation für ein Intervall ist das paar von Datum- /Uhrzeit-Zeichenfolgen getrennt durch einen Schrägstrich:
2008-01-01T13:00/2008-01-01T13:56
.Ihre Eingabe-strings haben ein anderes schwerwiegendes problem: Keine Anzeige offset von UTC oder Zeitzone. Ohne eine offset-oder Zeit-zone, wir müssen zurückgreifen auf die übernahme generischen 24-Stunden-Tage. Dies ignoriert Anomalien wie Daylight Saving Time (DST), die führen kann in 23 oder 25 Stunden lange Tage.
Wenn Sie wissen, die Zeit-zone soll für die ankommenden strings übergeben, als zweites argument, um eine korrekte Ergebnis.
java.Zeit
Diese Frage ist ziemlich alt. Seitdem Java verdrängte den lästigen alten Datum-Zeit-Klassen (
Date
,Calendar
usw.) mit modernen java.Zeit-Klassen. Wir verwenden java.Zeit, die im Beispiel-code unten.Beispiel-Klasse
Hier ist eine vollständige Klasse für die Verarbeitung dieser Saiten wie in deiner Frage. Ein
Dauer
produziert wird.Hinweis: die
main
Methode innerhalb der Klasse zum Beispiel.Zuerst ein paar Anrufe, ohne Angabe einer Zeitzone. Also der UTC und 24-Stunden-Tage verwendet werden.
Einem anderen paar Anrufe, in denen wir angeben, in der vorgesehenen Zeit zone.
Live-code
Sehen diese Klasse laufen in live-code in IdeOne.com.
Wie bereits an anderer Stelle auf dieser Seite, Ihr Ausgabe-format mit time-of-day-Stil, wie
00:56
ist mehrdeutig und verwirrend und sollte vermieden werden. DieDuration
Klasse verwendet stattdessen standard ISO-8601-format für die Dauer. Oben sehen wir die Ergebnisse der fünfzig-sechs Minuten und dreizehn Minuten.Über java.Zeit
Den java.Zeit framework ist in Java 8 und höher. Diese Klassen verdrängen die lästige alte legacy Datum-Zeit-Klassen wie
java.util.Date
,Calendar
, &" = SimpleDateFormat
.Den Joda-Time Projekt, jetzt in Wartung-Modus, rät der migration auf die java.Zeit Klassen.
Um mehr zu erfahren, siehe die Oracle Tutorial. Und die Suche Stack Overflow für viele Beispiele und Erklärungen. Spezifikation JSR 310.
Wo erhalten Sie die java.Zeit-Klassen?
Den ThreeTen-Extra Projekt erweitert die java.mal mit zusätzlicher Klassen. Dieses Projekt ist ein Testgelände für mögliche künftige Erweiterungen zu java.Zeit. Sie finden möglicherweise einige nützliche Klassen, die hier wie
Interval
,YearWeek
,YearQuarter
, und mehr.InformationsquelleAutor Basil Bourque