Ich habe eine Zeichenfolge im Muster yyyy-MM-dd hh: mm a Und ich kann das Zeitzonenobjekt separat erhalten, in dem die obige Zeichenfolge das Datum darstellt.
Ich möchte dies in das folgende Format konvertieren JJJJ-MM-TT HH: mm: ss Z
Wie kann ich das machen?
Sie können SimpleDateFormat mit yyyy-MM-dd HH:mm:ss
verwenden und explizit die TimeZone setzen:
public static Date getSomeDate(final String str, final TimeZone tz)
throws ParseException {
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm a");
sdf.setTimeZone(tz);
return sdf.parse(str);
}
/**
* @param args
* @throws IOException
* @throws InterruptedException
* @throws ParseException
*/
public static void main(final String[] args) throws ParseException {
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
System.out.println(sdf.format(getSomeDate(
"2010-11-17 01:12 pm", TimeZone.getTimeZone("Europe/Berlin"))));
System.out.println(sdf.format(getSomeDate(
"2010-11-17 01:12 pm", TimeZone.getTimeZone("America/Chicago"))));
}
Druckt aus:
2010-11-17 13:12:00 +0100
2010-11-17 20:12:00 +0100
Update 2010-12-01: Wenn Sie eine spezielle Zeitzone explizit ausdrucken möchten, setzen Sie sie im SimpleDateFormat:
sdf.setTimeZone(TimeZone .getTimeZone("IST"));
System.out.println(sdf.format(getSomeDate(
"2010-11-17 01:12 pm", TimeZone.getTimeZone("IST"))));
Welche druckt 2010-11-17 13:12:00 +0530
LocalDateTime.parse( // Parse string as value without time zone and without offset-from-UTC.
"2017-01-23 12:34 PM" ,
DateTimeFormatter.ofPattern( "uuuu-MM-dd hh:mm a" )
) // Returns a `LocalDateTime` object.
.atZone( ZoneId.of( "America/Montreal" ) ) // Assign time zone, to determine a moment. Returns a `ZonedDateTime` object.
.toInstant() // Adjusts from zone to UTC.
.toString() // Generate string: 2017-01-23T17:34:00Z
.replace( "T" , " " ) // Substitute SPACE for 'T' in middle.
.replace( "Z" , " Z" ) // Insert SPACE before 'Z'.
Die anderen Antworten verwenden die problematischen alten Datums-/Uhrzeit-Klassen (Date
, Calendar
usw.), die jetzt veraltet sind und durch die Java.time-Klassen ersetzt werden.
LocalDateTime
Ich habe eine Zeichenfolge im Muster jjjj-MM-tt hh: mm a
Eine solche Eingabezeichenfolge enthält keine Angabe von UTC-Versatz oder Zeitzone. Also analysieren wir als LocalDateTime
.
Definieren Sie ein Formatierungsmuster, das mit Ihrer Eingabe übereinstimmt, mit einem DateTimeFormatter
-Objekt.
String input = "2017-01-23 12:34 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd hh:mm a" );
LocalDateTime ldt = LocalDateTime.parse( input , f );
ldt.toString (): 2017-01-23T12: 34
Beachten Sie, dass LocalDateTime
nicht ein bestimmter Moment ist, sondern nur eine vage Vorstellung von einer Reihe möglicher Momente. Zum Beispiel ist Frankreich einige Minuten nach Mitternacht in Paris noch "gestern" in Montréal, Kanada. Ohne den Kontext einer Zeitzone wie Europe/Paris
oder America/Montreal
hat es keine Bedeutung, nur "wenige Minuten nach Mitternacht" zu sagen.
ZoneId
und ich kann das Zeitzonenobjekt separat erhalten, in dem die obige Zeichenfolge das Datum darstellt.
Eine Zeitzone wird durch die Klasse ZoneId
dargestellt.
Geben Sie einen richtigen Zeitzonennamen im Format continent/region
an, z. B. America/Montreal
, Africa/Casablanca
oder Pacific/Auckland
. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben wie EST
oder IST
, da sie nicht echte Zeitzonen sind, nicht standardisiert und nicht einmal eindeutig (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime
Verwenden Sie ZoneId
, um ein ZonedDateTime
zu erhalten, bei dem es sich tatsächlich um einen Punkt auf der Timeline handelt, einen bestimmten Moment in der Geschichte.
ZonedDateTime zdt = ldt.atZone( z );
zdt.toString (): 2017-01-23T12: 34-05: 00 [America/Montreal]
Instant
Ich möchte das in das folgende Format konvertieren. JJJJ-MM-TT HH: mm: ss Z
Stellen Sie zunächst fest, dass ein Z
-Literalzeichen für Zulu
eine Abkürzung ist und UTC bedeutet. Mit anderen Worten, ein Offset-from-UTC von null Stunden, +00:00
.
Die Klasse Instant
repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Ziffern eines Dezimalbruchs).
Sie können ein Instant
-Objekt aus einem ZonedDateTime
extrahieren.
Instant instant = zdt.toInstant(); // Extracting the same moment but in UTC.
Um eine Zeichenfolge im Standardformat ISO 8601 zu generieren, z. B. 2017-01-22T18:21:13.354Z
, rufen Sie toString
auf. Das Standardformat hat keine Leerzeichen, verwendet ein T
, um das Jahr-Monat-Datum von der Stunde-Minute-Sekunde zu trennen, und fügt das Z
kanonisch für einen Offset von Null hinzu.
String output = instant.toString();
instant.toString (): 2017-01-23T17: 34: 00Z
Ich empfehle nach Möglichkeit, die Standardformate zu verwenden. Wenn Sie darauf bestehen, Leerzeichen in dem angegebenen gewünschten Format zu verwenden, definieren Sie entweder Ihr eigenes Formatierungsmuster in einem DateTimeFormatter
-Objekt oder führen Sie einfach eine Zeichenfolgenbearbeitung für die Ausgabe von Instant::toString
aus.
String output = instant.toString()
.replace( "T" , " " ) // Substitute SPACE for T.
.replace( "Z" , " Z" ); // Insert SPACE before Z.
ausgabe: 2017-01-23 17:34:00 Z
Versuchen Sie es mit diesem Code live bei IdeOne.com .
Das Java.time -Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die störenden alten Legacy Datum-Zeit-Klassen wie Java.util.Date
, Calendar
, & SimpleDateFormat
.
Das Projekt Joda-Time , jetzt im Wartungsmodus , empfiehlt die Migration zu den Klassen Java.time .
Weitere Informationen finden Sie unter Oracle Tutorial . Durchsuchen Sie den Stack Overflow nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Wo erhalten Sie die Java.time-Klassen?
Das ThreeTen-Extra -Projekt erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von Java.time. Hier finden Sie einige nützliche Klassen wie Interval
, YearWeek
, YearQuarter
und mehr .
Verwenden Sie SimpleDateFormat
String string1 = "2009-10-10 12:12:12 ";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z")
sdf.setTimeZone(tz);
Date date = sdf.parse(string1);
Zweifellos hat das allgemein verwendete Format die Form 2014-10-05T15:23:01Z
(TZ).
Dafür muss man diesen Code verwenden
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
String dateInString = "2014-10-05T15:23:01Z";
try {
Date date = formatter.parse(dateInString.replaceAll("Z$", "+0000"));
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
}
Seine Ausgabe ist Sun Oct 05 20:53:01 IST 2014
Ich bin mir jedoch nicht sicher, warum wir "All" ersetzen mussten, wenn Sie "replace" nicht hinzufügen.
Erstellen Sie eine neue Instanz von SimpleDateFormat mit Ihrem Datumsmuster. Anschließend können Sie seine parse-Methode aufrufen, um Datumszeichenfolgen in ein Java.util.Date -Objekt zu konvertieren.