Ich möchte diesen GMT-Zeitstempel in GMT + 13 konvertieren:
2011-10-06 03:35:05
Ich habe ungefähr 100 verschiedene Kombinationen von DateFormat, TimeZone, Date, GregorianCalendar usw. ausprobiert, um diese SEHR grundlegende Aufgabe zu erledigen.
Dieser Code macht das, was ich für die AKTUELLE ZEIT will:
Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
formatter.setTimeZone(TimeZone.getTimeZone("GMT+13"));
String newZealandTime = formatter.format(calendar.getTime());
Ich möchte jedoch die Zeit einstellen, anstatt die aktuelle Zeit zu verwenden.
Ich habe festgestellt, dass ich jedes Mal, wenn ich versuche, die Zeit so einzustellen:
calendar.setTime(new Date(1317816735000L));
Die TimeZone des lokalen Computers wird verwendet. Warum das? Ich weiß, dass, wenn "new Date ()" UTC + 0 Zeit zurückgibt, warum beim Einstellen der Zeit in Millisekunden nicht mehr davon ausgegangen wird, dass die Zeit in UTC ist?
Ist es möglich, zu:
- Stellen Sie die Uhrzeit für ein Objekt ein (Kalender / Datum / Zeitstempel).
- (Möglicherweise) Legen Sie die Zeitzone des anfänglichen Zeitstempels fest (calendar.setTimeZone (...))
- Formatieren Sie den Zeitstempel mit einer neuen Zeitzone (formatter.setTimeZone (...)).
- Gibt eine Zeichenfolge mit neuer Zeitzonenzeit zurück. (formatter.format (calendar.getTime ()))
Vielen Dank im Voraus für jede Hilfe: D.
1317816735000L
der falsche Zeitstempel für ist2011-10-06 03:35:05 GMT
. Ansonsten ist Ihr Ansatz korrekt.java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .Antworten:
Für mich ist der einfachste Weg, dies zu tun:
Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //Here you say to java the initial timezone. This is the secret sdf.setTimeZone(TimeZone.getTimeZone("UTC")); //Will print in UTC System.out.println(sdf.format(calendar.getTime())); //Here you set to your timezone sdf.setTimeZone(TimeZone.getDefault()); //Will print on your default Timezone System.out.println(sdf.format(calendar.getTime()));
quelle
review
in der Schlangedate = sdf.parse(review);
sdf.parse(DateObject)
in Java, das ich verwende , nicht definiert istJDK.1.7
.Es ist sehr wichtig zu verstehen, wie Computerzeit funktioniert. Vor diesem Hintergrund stimme ich zu, dass eine API, mit der Sie Computerzeit wie in Echtzeit verarbeiten können, so funktionieren sollte, dass Sie sie wie in Echtzeit behandeln können. Zum größten Teil ist dies der Fall, aber es gibt einige wichtige Versehen, die Aufmerksamkeit erfordern.
Jedenfalls schweife ich ab !! Wenn Sie einen UTC-Offset haben (besser in UTC als in GMT-Offsets), können Sie die Zeit in Millisekunden berechnen und zu Ihrem Zeitstempel hinzufügen. Beachten Sie, dass ein SQL-Zeitstempel von einem Java-Zeitstempel abweichen kann, da die Art und Weise, wie der Ablauf der Epoche berechnet wird, nicht immer gleich ist - abhängig von Datenbanktechnologien und auch Betriebssystemen.
Ich würde Ihnen raten, System.currentTimeMillis () als Zeitstempel zu verwenden, da diese in Java konsistenter verarbeitet werden können, ohne sich Gedanken über die Konvertierung von SQL-Zeitstempeln in Java-Datumsobjekte usw. machen zu müssen.
Um Ihren Offset zu berechnen, können Sie Folgendes versuchen:
Long gmtTime =1317951113613L; // 2.32pm NZDT Long timezoneAlteredTime = 0L; if (offset != 0L) { int multiplier = (offset*60)*(60*1000); timezoneAlteredTime = gmtTime + multiplier; } else { timezoneAlteredTime = gmtTime; } Calendar calendar = new GregorianCalendar(); calendar.setTimeInMillis(timezoneAlteredTime); DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z"); formatter.setCalendar(calendar); formatter.setTimeZone(TimeZone.getTimeZone(timeZone)); String newZealandTime = formatter.format(calendar.getTime());
Ich hoffe das ist hilfreich!
quelle
Wie immer empfehle ich, diesen Artikel über Datum und Uhrzeit in Java zu lesen , damit Sie ihn verstehen.
Die Grundidee ist, dass "unter der Haube" alles in UTC-Millisekunden seit der Epoche erledigt wird. Dies bedeutet, dass es am einfachsten ist, wenn Sie überhaupt keine Zeitzonen verwenden, mit Ausnahme der Zeichenfolgenformatierung für den Benutzer.
Daher würde ich die meisten von Ihnen vorgeschlagenen Schritte überspringen.
Alternativ können Sie die Joda-Zeit verwenden . Ich habe gehört, es ist eine viel intuitivere Datetime-API.
quelle
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. ALocalDateTime
hat kein Konzept von Offset noch Zeitzone, so dass es sich nicht ein tatsächliches Moment auf der Zeitleiste darstellen.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 ); // 13 hours ahead of UTC, in the far east of the globe.
OffsetDateTime
Wenden Sie es an, um ein
OffsetDateTime
Objekt zu erhalten. Dies wird zu einem tatsächlichen Moment auf der Zeitachse.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 einemZonedDateTime
eher als ein bloßen versetzt.Geben Sie einen geeigneten Zeitzonennamen an . Verwenden Sie niemals die Abkürzung mit 3-4 Buchstaben, da
EST
oderIST
da es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind. Zum BeispielPacific/Auckland
.ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime
Wenden Sie die an
ZoneId
.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 ); // Same moment in time, but seen through lens of Paris wall-clock time.
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, dassZonedDateTime
das Standardformat sinnvoll erweitert wird, indem der Name der Zeitzone in eckigen Klammern angehängt wird.Suchen Sie für andere Formate im Stapelüberlauf nach
DateTimeFormatter
Klasse. Bereits viele Male abgedeckt.Geben Sie a
FormatStyle
und a anLocale
.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 eineAsia/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.quelle
Die Lösung ist eigentlich ganz einfach (reines, einfaches Java):
System.out.println(" NZ Local Time: 2011-10-06 03:35:05"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime localNZ = LocalDateTime.parse("2011-10-06 03:35:05",formatter); ZonedDateTime zonedNZ = ZonedDateTime.of(localNZ,ZoneId.of("+13:00")); LocalDateTime localUTC = zonedNZ.withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime(); System.out.println("UTC Local Time: "+localUTC.format(formatter));
AUSGABE IST:
NZ Local Time: 2011-10-06 03:35:05 UTC Local Time: 2011-10-05 14:35:05
quelle
Ich habe mich umgesehen und glaube nicht, dass es in Java eine Zeitzone gibt, die GMT + 13 ist. Ich denke, Sie müssen Folgendes verwenden:
Calendar calendar = Calendar.getInstance(); //OR Calendar.getInstance(TimeZone.getTimeZone("GMT")); calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY)+13); Date d = calendar.getTime();
(Wenn dies der Fall ist, ändern Sie "GMT" in diese Zeitzone und entfernen Sie die 2. Codezeile.)
ODER
SimpleDateFormat df = new SimpleDateFormat(); df.setTimeZone(TimeZone.getTimeZone("GMT+13")); System.out.println(df.format(c.getTime()));
Wenn Sie eine bestimmte Uhrzeit / ein bestimmtes Datum einstellen möchten, können Sie auch Folgendes verwenden:
calendar.set(Calendar.DATE, 15); calendar.set(Calendar.MONTH, 3); calendar.set(Calendar.YEAR, 2011); calendar.set(Calendar.HOUR_OF_DAY, 13); calendar.set(Calendar.MINUTE, 45); calendar.set(Calendar.SECOND, 00);
quelle
Wir können damit umgehen, indem wir den Versatzwert verwenden
public static long convertDateTimeZone(long lngDate, String fromTimeZone, String toTimeZone){ TimeZone toTZ = TimeZone.getTimeZone(toTimeZone); Calendar toCal = Calendar.getInstance(toTZ); TimeZone fromTZ = TimeZone.getTimeZone(fromTimeZone); Calendar fromCal = Calendar.getInstance(fromTZ); fromCal.setTimeInMillis(lngDate); toCal.setTimeInMillis(fromCal.getTimeInMillis() + toTZ.getOffset(fromCal.getTimeInMillis()) - TimeZone.getDefault().getOffset(fromCal.getTimeInMillis())); return toCal.getTimeInMillis(); }
Testcode-Snippet:
System.out.println(new Date().getTime()) System.out.println(convertDateTimeZone(new Date().getTime(), TimeZone .getDefault().getID(), "EST"));
Ausgabe: 1387353270742 1387335270742
quelle
Ich habe diesen Code ausprobiert
try{ SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss Z"); Date datetime = new Date(); System.out.println("date "+sdf.format(datetime)); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); System.out.println("GMT "+ sdf.format(datetime)); sdf.setTimeZone(TimeZone.getTimeZone("GMT+13")); System.out.println("GMT+13 "+ sdf.format(datetime)); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); System.out.println("utc "+sdf.format(datetime)); Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT")); DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z"); formatter.setTimeZone(TimeZone.getTimeZone("GMT+13")); String newZealandTime = formatter.format(calendar.getTime()); System.out.println("using calendar "+newZealandTime); }catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
und dieses Ergebnis zu bekommen
date 06-10-2011 10:40:05 +0530 GMT 06-10-2011 05:10:05 +0000 // here getting 5:10:05 GMT+13 06-10-2011 06:10:05 +1300 // here getting 6:10:05 utc 06-10-2011 05:10:05 +0000 using calendar 06 Oct 2011 18:10:05 GMT+13:00
quelle
Joda-Zeit
Die Klassen java.util.Date/Calendar sind ein Chaos und sollten vermieden werden.
Update: Das Joda-Time-Projekt befindet sich im Wartungsmodus. Das Team empfiehlt die Migration zu den Klassen java.time.
Hier ist Ihre Antwort mit der Joda-Time 2.3-Bibliothek. Sehr leicht.
Wie im Beispielcode angegeben, empfehle ich, wo immer möglich benannte Zeitzonen zu verwenden, damit Ihre Programmierung die Sommerzeit verarbeiten kann (DST) und andere Anomalien verarbeiten kann.
Wenn Sie
T
anstelle eines Leerzeichens ein in der Mitte Ihrer Zeichenfolge platziert haben , können Sie die ersten beiden Codezeilen überspringen und sich mit einem Formatierer befassen, um die Zeichenfolge zu analysieren. Der DateTime- Konstruktor kann eine Zeichenfolge im ISO 8601- Format annehmen .// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so. // import org.joda.time.*; // import org.joda.time.format.*; // Parse string as a date-time in UTC (no time zone offset). DateTimeFormatter formatter = org.joda.time.format.DateTimeFormat.forPattern( "yyyy-MM-dd' 'HH:mm:ss" ); DateTime dateTimeInUTC = formatter.withZoneUTC().parseDateTime( "2011-10-06 03:35:05" ); // Adjust for 13 hour offset from UTC/GMT. DateTimeZone offsetThirteen = DateTimeZone.forOffsetHours( 13 ); DateTime thirteenDateTime = dateTimeInUTC.toDateTime( offsetThirteen ); // Hard-coded offsets should be avoided. Better to use a desired time zone for handling Daylight Saving Time (DST) and other anomalies. // Time Zone list… http://joda-time.sourceforge.net/timezones.html DateTimeZone timeZoneTongatapu = DateTimeZone.forID( "Pacific/Tongatapu" ); DateTime tongatapuDateTime = dateTimeInUTC.toDateTime( timeZoneTongatapu );
Dump diese Werte ...
System.out.println( "dateTimeInUTC: " + dateTimeInUTC ); System.out.println( "thirteenDateTime: " + thirteenDateTime ); System.out.println( "tongatapuDateTime: " + tongatapuDateTime );
Beim Laufen…
quelle
Datum und Uhrzeit für alle Zeitzonen anzeigen
import java.util.Calendar; import java.util.TimeZone; import java.text.DateFormat; import java.text.SimpleDateFormat; static final String ISO8601 = "yyyy-MM-dd'T'HH:mm:ssZ"; DateFormat dateFormat = new SimpleDateFormat(ISO8601); Calendar c = Calendar.getInstance(); String formattedTime; for (String availableID : TimeZone.getAvailableIDs()) { dateFormat.setTimeZone(TimeZone.getTimeZone(availableID)); formattedTime = dateFormat.format(c.getTime()); System.out.println(formattedTime + " " + availableID); }
quelle
Wir können den UTC / GMT-Zeitstempel ab dem angegebenen Datum erhalten.
/** * Get the time stamp in GMT/UTC by passing the valid time (dd-MM-yyyy HH:mm:ss) */ public static long getGMTTimeStampFromDate(String datetime) { long timeStamp = 0; Date localTime = new Date(); String format = "dd-MM-yyyy HH:mm:ss"; SimpleDateFormat sdfLocalFormat = new SimpleDateFormat(format); sdfLocalFormat.setTimeZone(TimeZone.getDefault()); try { localTime = (Date) sdfLocalFormat.parse(datetime); Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.getDefault()); TimeZone tz = cal.getTimeZone(); cal.setTime(localTime); timeStamp = (localTime.getTime()/1000); Log.d("GMT TimeStamp: ", " Date TimegmtTime: " + datetime + ", GMT TimeStamp : " + localTime.getTime()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return timeStamp; }
Die UTC-Zeit wird basierend auf dem übergebenen Datum zurückgegeben.
Wir können den UTC-Zeitstempel auf das aktuelle Datum und die aktuelle Uhrzeit umkehren (umgekehrt).
public static String getLocalTimeFromGMT(long gmtTimeStamp) { try{ Calendar calendar = Calendar.getInstance(); TimeZone tz = TimeZone.getDefault(); calendar.setTimeInMillis(gmtTimeStamp * 1000); // calendar.add(Calendar.MILLISECOND, tz.getOffset(calendar.getTimeInMillis())); SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); Date currenTimeZone = (Date) calendar.getTime(); return sdf.format(currenTimeZone); }catch (Exception e) { } return ""; }
Ich hoffe das wird anderen helfen. Vielen Dank!!
quelle
Ein schneller Weg ist:
String dateText ="Thu, 02 Jul 2015 21:51:46"; long hours = -5; // time difference between places DateTimeFormatter formatter = DateTimeFormatter.ofPattern(E, dd MMM yyyy HH:mm:ss, Locale.ENGLISH); LocalDateTime date = LocalDateTime.parse(dateText, formatter); date = date.with(date.plusHours(hours)); System.out.println("NEW DATE: "+date);
Ausgabe
NEUES DATUM: 2015-07-02T16: 51: 46
quelle
Ihr Ansatz funktioniert ohne Änderungen.
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); // Timestamp for 2011-10-06 03:35:05 GMT calendar.setTime(new Date(1317872105000L)); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); formatter.setTimeZone(TimeZone.getTimeZone("GMT+13")); // Prints 2011-10-06 16:35:05 GMT+13:00 System.out.println(formatter.format(calendar.getTime()));
quelle
public Timestamp convertLocalTimeToServerDatetime(String dt,String timezone){ String clientDnT = dt ;// "2017-06-01 07:20:00"; try{ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse(clientDnT); TimeZone tz = TimeZone.getTimeZone(timezone.trim()); // get time zone of user sdf.setTimeZone(tz); // Convert to servertime zone SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); TimeZone tzInAmerica = TimeZone.getDefault(); sdf1.setTimeZone(tzInAmerica); // assign date to date String serverDate = sdf1.format(date); // Convert to servertime zone to Timestamp Date date2 = sdf.parse(serverDate); Timestamp tsm = new Timestamp(date2.getTime()); return tsm; } catch(Exception e){ System.err.println(e); } return null; }
quelle
var _timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
und in JavaTimeZone tz = TimeZone.getDefault(); tz.getID()
Dauer oder Zeitintervall mit zwei verschiedenen Zeitzonen ermitteln
import org.joda.time.{DateTime, Period, PeriodType} val s1 = "2019-06-13T05:50:00-07:00" val s2 = "2019-10-09T11:30:00+09:00" val period = new Period(DateTime.parse(s1), DateTime.parse(s2), PeriodType dayTime()) period.getDays period.getMinutes period.getHours
Ausgabeperiode = P117DT13H40M
days = 117 minutes = 40 hours = 13
quelle
Ich möchte die moderne Antwort geben.
Sie sollten nicht wirklich ein Datum und eine Uhrzeit von einer Zeichenfolge mit einem GMT-Versatz in eine Zeichenfolge mit einem anderen GMT-Versatz und mit einem anderen Format konvertieren möchten. Behalten Sie in Ihrem Programm einen Augenblick (einen Zeitpunkt) als geeignetes Datum / Uhrzeit-Objekt bei. Formatieren Sie Ihr Objekt nur dann in die gewünschte Zeichenfolge, wenn Sie eine Zeichenfolgenausgabe angeben müssen.
java.time
Eingabe analysieren
DateTimeFormatter formatter = new DateTimeFormatterBuilder() .append(DateTimeFormatter.ISO_LOCAL_DATE) .appendLiteral(' ') .append(DateTimeFormatter.ISO_LOCAL_TIME) .toFormatter(); String dateTimeString = "2011-10-06 03:35:05"; Instant instant = LocalDateTime.parse(dateTimeString, formatter) .atOffset(ZoneOffset.UTC) .toInstant();
Für die meisten Zwecke
Instant
ist es eine gute Wahl, einen Zeitpunkt zu speichern. Wenn Sie deutlich machen müssen, dass Datum und Uhrzeit von GMT stammen, verwenden SieOffsetDateTime
stattdessen ein.Ausgabe konvertieren, formatieren und drucken
ZoneId desiredZone = ZoneId.of("Pacific/Auckland"); Locale desiredeLocale = Locale.forLanguageTag("en-NZ"); DateTimeFormatter desiredFormatter = DateTimeFormatter.ofPattern( "dd MMM uuuu HH:mm:ss OOOO", desiredeLocale); ZonedDateTime desiredDateTime = instant.atZone(desiredZone); String result = desiredDateTime.format(desiredFormatter); System.out.println(result);
Dies gedruckt:
Ich habe die Zeitzone Pazifik / Auckland anstelle des von Ihnen erwähnten Versatzes +13: 00 angegeben. Ich habe verstanden, dass Sie neuseeländische Zeit wollten, und Pacific / Auckland sagt dem Leser dies besser. Die Zeitzone berücksichtigt auch die Sommerzeit (DST), sodass Sie dies (in den meisten Fällen) nicht in Ihrem eigenen Code berücksichtigen müssen.
Da
Oct
es auf Englisch ist, ist es eine gute Idee, dem Formatierer ein explizites Gebietsschema zu geben.GMT
könnte auch lokalisiert sein, aber ich denke, dass es nurGMT
in allen Gebietsschemas gedruckt wird .OOOO
Im Format Musterzeichenfolge ist eine Möglichkeit zum Drucken des Versatzes. Dies ist möglicherweise eine bessere Idee als das Drucken der Zeitzonenabkürzung, die Sie erhalten würden,z
da Zeitzonenabkürzungen häufig nicht eindeutig sind. Wenn Sie möchtenNZDT
(für New Zealand Daylight Time), legen Siez
stattdessen einfach dort.Deine Fragen
Ich werde Ihre nummerierten Fragen in Bezug auf die modernen Klassen in java.time beantworten.
Nein, die modernen Klassen sind unveränderlich. Sie müssen ein Objekt erstellen, das von Anfang an das gewünschte Datum und die gewünschte Uhrzeit hat (dies hat eine Reihe von Vorteilen, einschließlich der Thread-Sicherheit).
Die
atZone
Methode, die ich im Code verwende, gibt aZonedDateTime
mit der angegebenen Zeitzone zurück. Andere Datums- / Uhrzeitklassen haben eine ähnliche Methode, manchmal genanntatZoneSameInstant
oder andere Namen.Mit java.time sind das Konvertieren in eine neue Zeitzone und das Formatieren zwei verschiedene Schritte, wie gezeigt.
Ja, konvertieren Sie wie gezeigt in die gewünschte Zeitzone und formatieren Sie wie gezeigt.
Es ist nicht so, wie Sie denken, was gut dazu beiträgt, nur einige der (vielen) Designprobleme mit den alten Klassen aufzuzeigen.
Date
hat keine Zeitzone. Nur wenn Sie es drucken,toString
erfasst seine Methode Ihre lokale Zeitzone und verwendet sie zum Rendern der Zeichenfolge. Dies gilt fürnew Date()
. Dieses Verhalten hat in den letzten 25 Jahren viele, viele Programmierer verwirrt.Calender
hat eine Zeitzone. Es ändert sich nicht, wenn Sie es tuncalendar.setTime(new Date(1317816735000L));
.Verknüpfung
Oracle-Tutorial: Datum Uhrzeit zur Erläuterung der Verwendung von java.time.
quelle