tl; dr
Instant.ofEpochMilli( 1_317_816_735_000L )
.atZone( ZoneId.of( "Pacific/Auckland" ) )
.format( DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( new Locale( "en" , "NZ" ) ) )
…ebenfalls…
LocalDateTime.parse( "2011-10-06 03:35:05".replace( " " , "T" ) )
.atZone( ZoneId.of( "Pacific/Auckland" ) )
java.time
Die Frage und die meisten Antworten verwenden veraltete ältere Datums- und Zeitklassen aus den frühesten Versionen von Java. Diese alten Klassen haben sich als mühsam und verwirrend erwiesen. Vermeide sie. Verwenden Sie stattdessen die Klassen java.time.
ISO 8601
Ihre Eingabezeichenfolge hat fast das Standardformat ISO 8601. Ersetzen Sie einfach den SPACE in der Mitte durch a T
.
String input = "2011-10-06 03:35:05".replace( " " , "T" );
LocalDateTime
Analysieren Sie jetzt als, LocalDateTime
da der Eingabe keine Informationen zum Versatz von UTC oder zur Zeitzone fehlen. A LocalDateTime
hat kein Konzept von Offset noch Zeitzone, so dass es sich nicht ein tatsächliches Moment auf der Zeitleiste darstellen.
LocalDateTime ldt = LocalDateTime.parse( input );
ZoneOffset
Sie scheinen zu sagen, dass Sie aus dem Geschäftskontext wissen, dass die Absicht dieser Zeichenfolge darin besteht, einen Moment darzustellen, der 13 Stunden vor UTC liegt. Also instanziieren wir a ZoneOffset
.
ZoneOffset offset = ZoneOffset.ofHours( 13 );
OffsetDateTime
Wenden Sie es an, um ein OffsetDateTime
Objekt zu erhalten. Dies wird zu einem tatsächlichen Moment auf der Zeitachse.
OffsetDateTime odt = ldt.atOffset( offset);
ZoneId
Aber dann erwähnen Sie Neuseeland. Sie hatten also eine bestimmte Zeitzone im Sinn. Eine Zeitzone ist ein Versatz von UTC sowie eine Reihe von Regeln für die Behandlung von Anomalien wie Sommerzeit (DST). So können wir eine angeben ZoneId
zu einem ZonedDateTime
eher als ein bloßen versetzt.
Geben Sie einen geeigneten Zeitzonennamen an . Verwenden Sie niemals die Abkürzung mit 3-4 Buchstaben, da EST
oder IST
da es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind. Zum Beispiel Pacific/Auckland
.
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime
Wenden Sie die an ZoneId
.
ZonedDateTime zdt = ldt.atZone( z );
Sie können ganz einfach für den gleichen Moment auf der Zeitachse in eine andere Zone wechseln.
ZoneId zParis = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdtParis = zdt.withZoneSameInstant( zParis );
Zähle aus der Epoche
Ich empfehle dringend, Datums- und Uhrzeitwerte nicht als Epoche zu betrachten, z. B. Millisekunden ab Anfang 1970 UTC. Aber wenn Sie müssen, erstellen Sie eine Instant
aus einer solchen Nummer.
Instant instant = Instant.ofEpochMilli( 1_317_816_735_000L );
Weisen Sie dann, falls gewünscht, eine Zeitzone wie oben gezeigt zu, um sich von UTC zu entfernen.
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = instant.atZone( z );
Ihr Wert 1_317_816_735_000L
ist:
2011-10-05T12:12:15Z
(Mi, 05. Oktober 2011, 12:12:15 GMT)
2011-10-06T01:12:15+13:00[Pacific/Auckland]
(Donnerstag, 6. Oktober 2011, 01:12:15 Uhr in Auckland, Neuseeland).
Strings generieren
Rufen Sie einfach auf, um eine Zeichenfolge im Standardformat ISO 8601 zu generieren toString
. Beachten Sie, dass ZonedDateTime
das Standardformat sinnvoll erweitert wird, indem der Name der Zeitzone in eckigen Klammern angehängt wird.
String output = zdt.toString();
Suchen Sie für andere Formate im Stapelüberlauf nach DateTimeFormatter
Klasse. Bereits viele Male abgedeckt.
Geben Sie a FormatStyle
und a an Locale
.
Locale l = new Locale( "en" , "NZ" );
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( l );
String output = zdt.format( f );
Beachten Sie, dass die Zeitzone nichts mit dem Gebietsschema zu tun hat. Sie können eine Europe/Paris
Datums- und Uhrzeitangabe in japanischer Sprache und kulturellen Normen oder eine Asia/Kolkata
Datums- und Uhrzeitanzeige in portugiesischer Sprache und in brasilianischen Kulturnormen anzeigen lassen.
Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Datum Zeitklassen wie java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
.
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu java.time.
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen.
Ein großer Teil der java.time Funktionalität zurückportiert zu Java 6 und 7 in ThreeTen-Backport und weiter angepasst Android in ThreeTenABP (siehe So verwenden ... ).
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval
, YearWeek
, YearQuarter
und vieles mehr.