Java: gewusst Wie: konvertieren einer Zeichenfolge (HH:MM:SS) Dauer?
will ich konvertieren eine Zeichenfolge im format HH:MM:SS oder MM:SS oder SS in einen Datentyp von Dauer.
Lösung:
private ArrayList<Duration> myCdDuration = new ArrayList<Duration>();
private void convert(String aDuration) {
chooseNewDuration(stringToInt(splitDuration(aDuration))); //stringToInt() returns an int[] and splitDuration() returns a String[]
}
private void chooseNewDuration(int[] array) {
int elements = array.length;
switch (elements) {
case 1:
myCdDuration.add(newDuration(true, 0, 0, 0, 0, 0, array[0]));
break;
case 2:
myCdDuration.add(newDuration(true, 0, 0, 0, 0, array[0], array[1]));
break;
case 3:
myCdDuration.add(newDuration(true, 0, 0, 0, array[0], array[1],
array[2]));
break;
}
}
danke für die Hilfe ... ein einfacher Weg, dies zu tun ? -> erstellen Sie Ihre eigenen Klasse Dauer:
public class Duration {
private int intSongDuration;
private String printSongDuration;
public String getPrintSongDuration() {
return printSongDuration;
}
public void setPrintSongDuration(int songDuration) {
printSongDuration = intToStringDuration(songDuration);
}
public int getIntSongDuration() {
return intSongDuration;
}
public void setIntSongDuration(int songDuration) {
intSongDuration = songDuration;
}
public Duration(int songDuration) {
setIntSongDuration(songDuration);
}
Wandelt den int-Wert in einen String für die Ausgabe/drucken:
private String intToStringDuration(int aDuration) {
String result = "";
int hours = 0, minutes = 0, seconds = 0;
hours = aDuration / 3600;
minutes = (aDuration - hours * 3600) / 60;
seconds = (aDuration - (hours * 3600 + minutes * 60));
result = String.format("%02d:%02d:%02d", hours, minutes, seconds);
return result;
}
InformationsquelleAutor der Frage Frank | 2011-11-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
myCdDuration
ist verwirrend. Wollen Sie eineDuration
Objekt entspricht, was angegeben wurde, im string oder eine Liste vonDuration
Objekte, bei denen der erste enthält die Stunden, die zweiten die Minuten usw?Können Sie nicht nur werfen ein
String
in einem anderen Objekt zu. Sie sollte analysieren, den Wert in einen numerischen Typ, und verwenden SieDataTypeFactory
zu konstruieren, dieDuration
Objekt.InformationsquelleAutor der Antwort andri
Ich gehe davon aus, was Sie letztlich versuchen, zu erreichen, ist die Berechnung der Dauer der CD in Sekunden.
Gibt es mehrere Möglichkeiten, dies zu tun, aber ich denke, das einfachste ist, einfach aufteilen auf
:
zu bekommen, die Stunden -, Minuten-und Sekunden-Feldern, dann berechnen Sie die Dauer manuell:InformationsquelleAutor der Antwort Mansoor Siddiqui
tl;dr
Keine Notwendigkeit, zu definieren, Ihre eigenen
Duration
Klasse, wie Java bietet.Und analysieren standard ISO-8601 formatierte text.
Vermeiden
HH:MM:SS
formatWenn der string
08:30:00
du meinst "acht und eine halbe Stunde" Zeit eher als eine Zeit-of-day "halb acht in der früh", dann vermeiden Sie, dass das format derHH:MM:SS
. Das format mehrdeutig, erscheint ein time-of-Tag. Verwenden Sie stattdessen die standard-ISO-8601-format werden unten diskutiert.Dauer-und Zeit-of-day sind zwei sehr unterschiedliche Konzepte. Ihnen muss klar sein, jeder sollte deutlich in Ihrem Geist. Mit der mehrdeutige format:HH: MM:SS macht diese Unterscheidung noch schwieriger (so vermeiden Sie, dass das format!).
java.Zeit
Die moderne Art, die mit der java.Zeit-Klassen.
LocalTime
Ersten parse den string als
LocalTime
. Diese Klasse stellt eine Uhrzeit ohne Datum und ohne Uhrzeit zone. Ohne Zeit-zone bedeutet, dass diese Objekte basieren auf einem generischen 24-Stunden-Uhr, die ohne Rücksicht auf Anomalien wie Daylight Saving Time (DST).Wir nicht wirklich wollen, eine
LocalTime
wie Ihre input-string stellt einen Zeitraum von Zeit, anstatt eine time-of-Tag. Aber das ist nur der erste Schritt.Duration
Zur Darstellung der gewünschten span-Zeit möchten wir, dass die
Dauer
Klasse. Diese Klasse ist für Zeitspannen nicht an die timeline. Wir können durch die Umwandlung, dieLocalTime
immer über die Menge der Zeit, die seit Beginn der Zeit-of-day clock, die00:00:00.0
oderLocalTime.MIN
und dielt
wir nur instanziiert werden.Bearbeitung der input-string
Den Ansatz oben mit
LocalTime
funktioniert nur, wenn Sie Ihre Eingabe-strings repräsentieren eine Dauer von weniger als 24 Stunden. Wenn mehr als 24 Stunden, werden Sie Parsen der input-string selbst.Etwas wie den folgenden code. Natürlich die eigentliche Analyse richtet sich auf die Lösung der Mehrdeutigkeit des jeweiligen input-string. Ist
50:00
gemeint fünfzig Stunden oder fünfzig Minuten? (Diese Doppeldeutigkeit ist ein starker Grund, dies zu vermeiden verwirrend format, Wann immer möglich, und stick mit ISO-8601-Formate.)ISO 8601
Können wir das Ergebnis sehen durch die Erzeugung eines String in standard ISO-8601-format für die Dauer einfach durch Aufruf
Dauer::toString
. Die java.Zeit-Klassen verwenden ISO-8601 standardmäßig beim Parsen/generieren von strings. Für die Dauer, die das standard-format istPnYnMnDTnHnMnS
wo dieP
markiert den Anfang und dasT
trennt den Jahren-Monaten-Tagen Teil aus den Stunden-Minuten-Sekunden-Teil. So, unsere acht-und-ein-halb Stunden, wird angezeigt, wiePT8H30M
.System.aus.println ( "d....toString(): "+ d );
Sammeln
Duration
ObjekteKönnen Sie eine
List
holding-Elemente des TypsDuration
.Denken Sie daran, dass die Zeichenfolgen, die Sie finden in dieser Ausgabe wie
PT8H30M
sind nur, dass: Ausgabe des generierten strings. DieDuration
Typ ist nicht eine einfache Zeichenfolge, sondern eher generiert ein String-Objekt durch seinetoString
Methode.Wenn man sich an die ISO 8601-Formate, können Sie leicht analysieren sowie erzeugen solcher strings. Keine Notwendigkeit zu gehen durch die
LocalTime
Konvertierung rigamarole wir führten oben in dieser Antwort.Diesem Beispiel sehen code live in IdeOne.com.
Über java.Zeit
Den java.Zeit framework ist in Java 8 und höher. Diese Klassen verdrängen die lästige alte Vermächtnis Datum-Zeit-Klassen wie
java.util.Date
Calendar
&" = SimpleDateFormat
.Den Joda-Time Projekt, jetzt in Wartungsmodusrä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 der Antwort Basil Bourque
Ich geschrieben habe, diese Methode in meiner utils-Klasse zu analysieren, verschiedene Arten von Dauer-strings. Es ist Recht flexibel :
Dies ist, wie es analysiert die genannten Zeiträume :
InformationsquelleAutor der Antwort Rahul Verma
Ich würde vorschlagen nicht Verwendung
javax.xml.datatype.Duration
als seine im Zusammenhang mit der XML-Java-API und es ist verwirrend, um zu verwenden, wenn Sie nicht den Umgang mit XML. Darüber hinaus ist es eine abstrakte Klasse, und es gibt keine nicht-abstrakte dokumentiert die Umsetzung in Java SE, so müssten Sie entweder Ihre eigenen, nicht-abstrakte Implementierung oder erhalten eine Instanz irgendwie (wahrscheinlich, das Spiel mit der XML-API).Verwalten Sie Zeit und Daten, die in Java mit der
Date
undCalendar
Klassen. KonvertierenString
s zuDate
/Calendar
Sie verwendenDateFormat
oderSimpleDateFormat
. Lassen Sie führen Sie Ihre Dauer rechnen, obwohl das nicht 100% schön.Mansoor bietet eine Möglichkeit, um Dinge zu tun, die manuell mit String-manipulation und Handhabung dauern als numerische Werte - wenn Sie nur einfache Sachen, könnte es einfacher sein, das zu tun.
Wenn Sie führen mehr komplexe Dinge, vielleicht möchten Sie sich in http://joda-time.sourceforge.net/
InformationsquelleAutor der Antwort alex
Mit Java 8 und Java.Zeit.Dauer Sie können dies tun, gegeben, dass die Zeichenfolge im format HH:MM:SS oder MM:SS oder SS
InformationsquelleAutor der Antwort Asthor
Beispiel, Konvertieren Sie die Aktuellen DateTime Duration in Java 7.
Ausgabe -
P48Y5M13DT19H59M24.658S
InformationsquelleAutor der Antwort Ajay