1. Vorbereitungswissen
1. Die Tageslichtsparzeit von Amerika/new_york ist wie folgt: Die linke ist nicht die rechte ist
2016-3-13, 02:00:00 bis 2016-11-6, 02:00:00 Uhr
2017-3-12, 02:00:00 bis 2017-11-5, 02:00:00 Uhr
2. Drei -Buchstaben -Zeitzonen -ID
Für die Kompatibilität mit JDK 1.1.x werden auch einige Drei-Buchstaben-Zeitzonen-IDs (z. B. "PST", "CTT", "AST") unterstützt.
Ihre Verwendung wird jedoch verworfen, da die gleiche Abkürzung häufig in mehreren Zeitzonen verwendet wird
Zum Beispiel CST: Es hat 4 Bedeutungen, die Vereinigten Staaten, Australien, China, Kuba Zeit
3. Standard
GMT: Green Wenig Time Greenwich Standard-Zeit wurde als Standardzeitreferenz GMT+12-> GMT-12 vor 1960 verwendet
Der Bereich von Java8 beträgt GMT+18-> GMT-18
UTC: Koordinierte universelle Zeitzeit koordiniert die Weltzeit, die genauer als GMT ist und am 1. Januar 1972 zum neuen Standard wird; UTC, UTC+1, UTC+2 ... UTC+12, UTC-12 ... UTC-1
Java8's Range UTC-18-> UTC+18
DST: Tageslichtsparzeit bezieht sich auf die Zeit, in der die Uhr im Sommer eine Stunde lang aufgetaucht ist, um das Sonnenlicht früher zu verwenden. Es heißt Sommerzeit in Großbritannien;
Derzeit nutzen mehr als 110 Länder die Sommerzeit.
In China wurde es erst 6 Jahre von 1986 bis 1992 umgesetzt und danach abgesagt. Die Gründe sind wie folgt:
1. China hat eine große Spannweite in den Richtungen des Ostens und des Westens und verabschiedet einen einheitlichen Ost -Achtel -Bezirk, der mit der Tagesrettungszeit mit Tageslicht unvereinbar ist.
2. In Gebieten mit hoher Breite ändert sich die Tages- und Nachtzeit im Winter und im Sommer erheblich. es ist nicht sehr bedeutungsvoll;
V.
5. Wie man Chinas Zeitzone darstellt
GMT+8
UTC+8
Asien/Harbin Harbin // China Standardzeit
Asien/Chongqing Chongqing // China Standardzeit
Asien/Chungking Chongqing // China Standardzeit
Asien/urumqi urumqi // China Standardzeit
Asien/Shanghai Shanghai (Ost 8 Distrikt) // China Standardzeit
PRC
Asien/Macao Macau // China Standardzeit
Hongkong Hong Kong // Hongkong Zeit stimmt mit der Standardzeit China überein
Asien/Hong_Kong Hong Kong
Asien/Taipei Taipei (Taiwan) // China Standard Time Singapur ist dasselbe wie Chinas Zeit;
Asien/Singapur
Singapur
6. Darstellung von Standardzeitzonen
koordinierte Weltzeit
UTC+0
UTC-0
GMT GMT
GMT0 GMT
Etc/gmt gmt
Etc/gmt+0 gmt
Etc/gmt-0 gmt
ETC/GMT0 GMT0 GMTS Standardzeit Hinweis: GMT+XX (-xx) ist sehr inklusiv und kann die Darstellung verschiedener Zeit automatisch identifizieren.
2. Zeitzonenkonvertierung
Umgebung: Vor Java8
1. Konvertieren Sie die aktuelle Zeit in die angegebene Zeitzone -Anzeige
@Test public void test () löst Ausnahme aus {Datum a = new Date (); SimpleDateFormat SF = new SimpledateFormat ("yyyy-mm-dd hh: mm: ss"); sf.settimezone (timezone.getTimezone ("America/new_york")); // Die chinesische Zeitzone in die New Yorker Zeitzone des United States System.out.println (SF.Format (a)) konvertieren; }2. Die angegebene Zeit wird in die angegebene Zeitzone -Anzeige umgewandelt
Kann ich wirklich richtig konvertieren? Es scheint eine Gefahr zu geben, ich habe mir die Implementierung online angesehen
Ich fühle ein kleines Problem mit der Tagesrettungszeit
// Implementierungsmethode 1: Tageslichtsparenzeit gilt nicht als @test public void test2 () Ausnahme aus der Ausnahme { /datetime = new SimpledateFormat ("yyyy-mm-dd hh: mm: ss"). Analyse ("2016-11-6 14:00:00"); Date datetime = new SimpledateFormat ("yyyy-mm-dd hh: mm: ss"). Parse ("2016-10-6 14:00:00"); Timezone zhong = timezone.getTimezone ("gmt+8: 00"); // China TimeZone York = TimeZone.getTimeZone ("America/New_york"); // GMT-5 // Der hier festgelegte Zeitzonenversatz gibt es nicht bei Tageslicht, fehlerhafte lange Chinesemills = DateTime.getTime () + York.getrawoffset ()-Zhong.getrawoffset (); Datum Datum = neues Datum (Chinesemills); System.out.println (new SimpledateFormat ("yyyy-mm-dd hh: mm: ss"). Format (Datum)); } // Implementierungsmethode 2 Sie erinnern sich möglicherweise, dass die Verwendung von Calendar.dst_offset der Kalenderklasse // es ist immer noch nicht das Recht auf Kalender.dst_Offset Dies ist tot @TestPublic void test3 () Ausnahme ausnahm. SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"). Parse ("2016-11-6 1:00:00"); // Datum Uhrzeit = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"). PARSE ("2016-11-6 1:00:00"); // Date Time = New Simple Time = New Simpledateformat ("yyy- mm"); // Date time = New Simple time = New Simpledateformat ("yyyyyy.mm"); // Zeit = neue Zeit = neue Zeit = neuer Zeit = neuer Zeit = neuer Zeit = neuer Zeit = neue simpfe-time = New Simple-timat (New Simple, ("yyy- mm" mm "); // date time = new time = new time = new time HH:mm:ss").parse("2016-11-6 0:59:00");//Date time =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-11-6 1:59:59");Date time =new SimpleDateFormat("yyyy-MM-dd HH: MM: ss "). Parse (" 2016-11-6 3:00:00 "); // 1. Erhalten Sie die lokale Zeit: Kalender Cal = Calendar.getInstance (); Cal.Settime (Zeit); Cal.Settimezone (Timezone.Getimezone (" America/new_yrynset =/ //. Cal.get (calendar.zone_offset)/(1000*60*60); // 3. Erhalten Sie den Differenzdifferenz von Tageslicht: Dies ist behoben, nicht auf dem dynamischen Urteil der Zeit. Solange es in der Zeitzone bei Tageslicht spart, ist es 1Int dstoffset = Cal.get (Calendar.dst_offset)/(1000*60*60); System.out.println (zoneOffset); System.out.println (DStoffset); // 4. Deduction Diese Unterschiede aus der örtlichen Zeit, um die utcal -Zeit zu erhalten. -(zoneOffset + dstoffset)); // Implementierungsmethode 3 Vorbereitung // Ist es nicht gesagt, dass Java automatisch Tageslichtsparenzeit für uns verarbeitet? // Lassen Sie uns zunächst einen einfachen Test durchführen, um festzustellen, ob die Methode für das Rettungszeit von Tageslicht korrekt ist, und Sie können schließen, ob die automatische Verarbeitung von Java korrekt ist. SimpleDateFormat SF = new SimpledateFormat ("yyyy-mm-dd hh: mm: ss"); sf.settimezone (TimeZone.getTimeZone ("GMT+0")); // Date datetime = sf.Parse ("2016-11-6 5:59:59"); Datum d1 = Sf.Parse ("2016-03-13 6:59:59"); // Falsch Datum d2 = Sf.Parse ("2016-03-13 7:00:00"); // True Datum d3 = Sf.Parse ("2016-11-6 6:59:59"); // false D4 = SF.PARSE ("2016-11-6"). Es gibt in der Tat kein Problem, den Beginn der Tageslichtsparzeit zu beurteilen, aber für die Endzeit der Tageslichtsparzeit habe ich es um eine Stunde im Voraus beurteilt // Sehen Sie sich die folgende Überprüfung an. Warum ist es also eine Stunde im Voraus? Wie löst ich es? Gegenwärtig kann ich nur Java8 d3 = sf.Parse ("2016-11-6 5:59:59") verwenden; // True d4 = Sf.Parse ("2016-11-6 6:00:00"); // False Timezone York = TimeZone.getimezone ("America/New_york"); // GMT-5 system.out.println ("Verwendet die Zielzeitzone Tageslichtsparzeit:"+isdaylight (York, D1)); System.out.println ("Verwendet die Zielzeitzone Tageslichtsparzeit:"+isdaylight (York, D2)); System.out.println ("Verwendet die Zielzeitzone Tageslichtsparzeit:"+isdaylight (York, D3)); System.out.println ("Verwendet die Zielzeitzone Tageslichtsparzeit:"+isdaylight (York, D4)); } // beurteilt, ob private boolean isdaylight (TimeZone -Zone, Datum) {return zone.Usedaylighttime () && zone.indaylighttime (Datum); } // Implementierungsmethode 3 // Durch die obige Überprüfung wissen wir, dass das Urteil des Systems problematisch ist. Durch das Festlegen der Zeitzone läuft das Programm automatisch bei Tageslichtsparenzeit. Zumindest kann ich nicht verstehen, warum @Testpublic void test5 () Ausnahme ausgelöst {// 13 Stunden Apart China + 8 New York-5 Changezone ("2016-3-13 14:59:59", "PRC", "America/New_york", "Yyyy-Mm-Dd HH: SS: SS"); 15:00:00 "," Prc "," America/new_york "," yyyy-mm-dd hh: mm: ss "); // 2016-03-13 03:00:00 Changezone (" 2016-11-6 13:59:59 "," PRC "," America/New_york "," YYY-JY-M0-MM: MM: MM ". 01:59:59 // Dieses Ergebnis ist falsch. Zeit, String srcid, String destid, String -Muster) löscht ParseException {// Setzen Sie die Standardzeitzone Timezone Zone = TimeZone.getTimeZone (SRCID); TimeZone.SetDefault (Zone); Datum Datum = new SimpledateFormat (Muster) .Parse (Zeit); // Setzen Sie die Zielzeitzone Timezone destzone = timeZone.getTimeZone (destid); SimpleDateFormat SDF = new SimpledateFormat (Muster); // Setzen Sie die Zeitzone so, dass sie sdf.settimezone (destzone) formatiert werden; String Changtime = SDF.Format (Datum); // Erhalten Sie das Zielzeitzonensystem. }Zusammenfassung: Die Ergebnisse der oben genannten drei Implementierungsmethoden sind für die Sommerzeit etwas problematisch
Drei, Java8 -Implementierung
1. Schauen wir uns zuerst die Zeitzonenänderungen in Java 8 an
// JDK8s verfügbare Zeitzone @TestPublic void testName1 () löst Ausnahme aus. ",]"); // 623 // Finden Sie die für (String id: id2) {if (! Ids.contains (id+",")) {System.out.print (id+",");}} // Schlussfolgerung: Alle Zeitzonen in jdk8 wurden alle vor // JDK8 wie folgt. AGT, ART, AST, BET, BST, CAT, CNT, CST, CTT, EAT, ECT, IET, IST, JST, MIT, NET, NST, PLT, PNT, PRT, PST, SST, VST, //, aber diese kurzen Namen sind eigentlich noch verfügbar, sie sind einfach nicht in der Support List LOCALDATETIMED DATIMEDDEDDE = LocalDateTime.Ofinstant (Instant.now (), zoneId.of (zoneId.short_ids.get ("pst"))); System.out.println ("/ndate =" + Datum);}2. So fügen Sie Zeitzoneninformationen hinzu oder konvertieren Sie sie
// localDate, localDatetime, sofortige Zeitzoneninformationen hinzufügen @TestPublic void testName3 () {localDate Datum = localdate.now (); // localdate add Zeitzoneninformationen // Methode 1ZonedDatetime Zone = Datum.Atstartofday (zoneId.outln ("gmt+08: 00: 00");););); Datum.AtStartofday (zoneId.SystemDefault ()); System.out.println (Zone); // Methode 2 LocalDate Datum2 = Localdate.now (zoneId.of ("gmt+0")); -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- zonime3 = localDatetime.now (Clock.System (zoneId.of ("gmt+0")); // Methode 4zonedDatetime ZonenTime4 = ZonedDatetime.of (Zeit, zoneId.of ("gmt+0"); System.out.println (Zonetime3); // ändern system.out.println (Zonetime4); // Änderung System.out.println("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------—3.. So erhalten Sie die angegebene Zeit der aktuellen Zeit (Test weggelassen)
// Erhalten Sie die angegebene Zeitzone der aktuellen Zeit, Referenzpunkt: 0 Zeitzone public localDateTime getCurrentzonetime (zoneId dest) {Objects.requirenonnull (dest); LocalDatetime time2 = localDateTime.now (Clock.System (dest)); String zonedesc = getzonedesc (TimeZone.getTimeZone (dest)); System.out.println (dest.getId ()+"entspricht der Standardzeitzone:"+zonedesc); System.out.println ("Zielzeitzone"+dest+"time"+time2.Format (DateTimeFormatter.ofPattern ("yyyy-mm-dd hh: mm: ss")); Rückgabezeit2;} // Standardzeitzone, Methode 1 // die Methode vor jdk8, verwenden Sie TimeZone Private Static String getZonedesc (TimeZone Destzone) {Objects.requirenonnull (Destzone); int offset = destzone.getRawoffset () / (1000 * 60 * 60); if (offset <= 0) {return "gmt"+string.Valueof (offset); } else {return "gmt +" + string.Valueof (offset); }} // Java8 -Methode, Methode 2, verwenden Sie Zoneruli // den Standardversatz der Zeitzone, Zonerules. regel.getSpandardOffset (zonedDatetime.now (dest) .toinstant ()). getId (); String S = StandardOffset.split (":") [0]; int offset = Integer.ParseInt (s); // Rückgabemethode 1: mit Stunden und Minuten // zurück "GMT"+StandardOffset; // Rückgabemethode 2: Nur mit Stunden, wenn (Offset> 0) {return "gmt+"+offset;} else {return "gmt"+offset;}}4.. So erhalten Sie die angegebene Zeit der angegebenen Zeitzone
Beginnen Sie mit der Implementierung des oben verbleibenden Zeitzonenproblems
In ähnlicher Weise schauen wir uns zunächst an, ob die Methode für die Zeitbeurteilung mit Tageslicht mit Java8 korrekt ist.
// Schreiben Sie aus erster Hand, um festzustellen, ob die Zeit in den Vereinigten Staaten bei Tageslicht sparen kann. LocalDatetime startDate = A. withmonth (3) .tolocaldate (). Attime (2, 0); LocalDatetime Startlightday = startDate.with (temporaladjusters.dayofweekmonth (2, tagsofweek.sunday)); // Update auf November LocalDatetime Enddate = A.withmonth (11) .Tolocaldate (). Atemnot (1, 59,59); örtlichDatetimedday = Endlicht enddate.with (temporaladjusters.dayofweenkinmonth (1, tagsofweek.sunday)); if (isbefore (startLightday) || A.isafter (Endlightday)) {System.out.Out.println ("Nicht im Daylight Saving Time"+A); Java8 Es gibt bereits eine vorgefertigte Methode, die besser ist als meine // in der angegebenen Zeit- und Zeitzone Public Boolean isdaylighttime (LocalDatetime A, ZoneId Dest) {ZonedDatetime z1 = A.ATzone (Dest); // oder auf diese Weise übertragen // zonedDatetime z2 = zonedDatetime.of (a, dest); System.out.println (z1.format (datetimeFormatter.ofPattern ("yyyy-mm-dd hh: mm: ss")); Zonerules Rules = dest.getRULES (); boolesche Flagge = Regeln. System.out.println (Flag); Rückkehr Flag; }// Testen Sie es und stellten fest, dass die Tageslichtsparenzeit von Java8 vollständig korrekt ist
// Es ist bekannt, dass 2016: Amerika/New_yorks Tageslicht-Rettungszeit: 2016-3-13 02:00:00 bis 2016-11-06 01:59:59 // (der zweite Sonntag im März und der erste Sonntag im November eines Jahres jedes Jahr) @TestPublic void testname () Ausnahme {// LocalDatetime a1 = = örtlich a1 = = = örtlich a1 = = örtlich a1 = örtlich a1 = örtlich a1 = örtlich a1 = localDatetime.now (). LocalDatetime A2 = LocalDatetime.of (2016, 3, 13, 1, 59,59); LocalDatetime A3 = LocalDatetime.of (2016, 3, 13, 2, 00); LocalDatetime A4 = localDatetime.of (2016, 11, 6, 1, 59,59); LocalDatetime A5 = LocalDatetime.of (2016, 11, 6, 2, 2, 0,0); // isdaylighttime (a2); // isdaylighttime (a3); // isdaylighttime (a4); // isdaylighttime (a5); =========================================================================== =========================================================================== =========================================================================== =========================================================================== =========================================================================== =========================================================================== ); // falseisdaylighttime (a3, zoneId.of ("America/new_york")); // Trueisdaylighttime (a4, zoneId.of ("America/new_york")); // truisdaylighttime (a5, zoneId.of ("America/new_york"); // fasle}}}}Implementieren Sie die Implementierung:
Version 1:
// Erhalten Sie den angegebenen Zeitreferenzpunkt für die angegebene Zeit: Standardzeitzone öffentliche localDatetime GetzongTime (localDatetime time, zoneId dest) {Objects.requirenonnull (dest); Return GetzongTime (Zeit, Null, Dest); } // Sie können nicht von ZonedDatetime von 2 Zeitzonen abziehen, denn sobald Sie die Zeitzone hier angegeben haben, ist diese Zeit diese Zeitzone öffentliche Lokaldatetime GetzongTime (LocalDatetime Time, ZoneId SRC, ZoneId Dest) {// Der Schwierigkeitsgrad ist, wie der Offset // die Default -Zeitzone hier China und die Vereinigten Staaten sind die Vereinigten Staaten der Vereinigten Staaten. Dies ist wahrscheinlich besser für Objekte geeignet. Requirenonnull (dest); ZonedDatetime z1 = null; if (src == null) {z1 = time.atzone (zoneId.SystemDefault ()); } else {z1 = time.atzone (src); } // Zeitzonenreaktion Änderungen in der Zeit zonedDatetime z2 = z1.withzonesameInstant (dest); System.out.println (dest.getId ()+"entspricht der Standardzeitzone:"+getzonedesc (TimeZone.getTimeZone (dest)); System.out.println ("Zielzeitzone"+dest+"Zeit"+z2.Format (DateTimeFormatter.ofPattern ("yyyy-mm-dd hh: mm: ss")); System.out.println ("-----------------"); Rücklaufzeit; }Der Test lautet wie folgt:
@Test public void test6 () löst eine Ausnahme aus {// Es wird erwartet, dass es nicht bei Tageslicht spart Time2016-03-13 01:59:59 localDatetime time4 = localDatetime.of (2016, 3, 13, 14, 59, 59); GetzongTime (Time4, zoneId.of ("America/new_york"); // Es wird erwartet, dass es bei Tageslicht spart Time2016-03-13 03:00:00 LOCALDATETIME TIME1 = localDatetime.of (2016, 3, 13, 15, 00, 00); GetzongTime (time1, zoneId.of ("America/new_york"); // Das erwartete Ergebnis in Tageslicht spart Zeit: 2016-11-06 01:59:59 // Ich habe das Gefühl, dass es wieder gescheitert ist. Mit anderen Worten, die Methode vor Java8 überträgt das Ende der Tageslicht, die die Methode vor dem Ende der Tageslicht-Rettungszeit genau das Ende des Endes, und die Zeit. 00:59:59, aber die Urteilsmethode von Java8 ist korrekt. Ist es nicht ein bisschen seltsam localDatetime time2 = localDatetime.of (2016, 11, 6, 14, 59, 59); GetzongTime (time2, zoneId.of ("America/new_york"); // Es wird nicht erwartet, dass es bei Tageslicht spart Time2016-11-06 02:00:00 LOCALDATETIME TIME 3 = localDatetime.of (2016, 11, 6, 15, 00, 00); GetzongTime (Time3, zoneId.of ("America/new_york"); }Ich bezweifle jetzt, ob dieses Ergebnis ein systematisches Berechnungsproblem ist, oder verstehe ich den New Yorker Zoll nicht?
Aber ich kann trotzdem die gewünschten Ergebnisse erzielen und 2 Methoden verwenden:
WithearLierOffSetatoverlap (), Withlateroffsetatoverlap ()
Version 2:
// Erhalten Sie den angegebenen Zeitreferenzpunkt für die angegebene Zeit: Standardzeitzone öffentliche localDatetime GetzongTime2 (localDatetime time, zoneId dest) {Objekte.Requirenonnull (dest Der Offset // Die Standardzeitzone wird hier in China in den Vereinigten Staaten verwendet, die Vereinigten Staaten sind die Vereinigten Staaten, daher ist sie wahrscheinlich besser für Objekte geeignet. Requirenonnull (Dest); ZonedDatetime z1 = null; if (src == null) {z1 = time.atzone (zoneId.SystemDefault ()); } else {z1 = time.atzone (src); } // zonedDatetime z2 = z1.withzonesameInstant (dest); // Überlappende Probleme langen Stunden mit Langzeiten = Dauer. Z2 = z2.Plushours (Stunden); System.out.println (dest.getId ()+"entspricht der Standardzeitzone:"+getzonedesc (TimeZone.getTimeZone (dest)); System.out.println ("Zielzeitzone"+dest+"Zeit"+z2.Format (DateTimeFormatter.ofPattern ("yyyy-mm-dd hh: mm: ss")); System.out.println ("-------------------"); Rückkehrzeit;}Test: OK
@Test public void test4 () löst eine Ausnahme aus {// Es wird erwartet, dass es nicht bei Tageslicht spart Time2016-03-13 01:59:59 LOCALDATETIME TIME 4 = localDatetime.of (2016, 3, 13, 14, 59, 59); Getzongtime2 (Time4, zoneId.of ("America/new_york")); // Es wird erwartet, dass es bei Tageslicht spart Time2016-03-13 03:00:00 LOCALDATETIME TIME1 = localDatetime.of (2016, 3, 13, 15, 00, 00); Getzongtime2 (Time1, zoneId.of ("America/new_york")); // Es wird erwartet, dass es bei Tageslicht spart Zeit 2016-11-06 02:59:59 LOCALDATETIME TIME2 = localDatetime.of (2016, 11, 6, 14, 59, 59); Getzongtime2 (Time2, zoneId.of ("America/new_york")); // Es wird nicht erwartet, dass es bei Tageslicht spart Zeit 2016-11-06 02:00:00 LOCALDATETIME TIME3 = localDatetime.of (2016, 11, 6, 15, 00, 00); Getzongtime2 (Time3, zoneId.of ("America/new_york")); }Ergebnis:
America/new_york entspricht der Standardzeitzone: GMT-5
Zeit der Zielzeitzone Amerika/New_york 2016-03-13 01:59:59
--------------------------
America/new_york entspricht der Standardzeitzone: GMT-5
Zeit der Zielzeitzone Amerika/new_york 2016-03-13 03:00:00
--------------------------
America/new_york entspricht der Standardzeitzone: GMT-5
Zeit der Zielzeitzone Amerika/New_york 2016-11-06 02:59:59
--------------------------
America/new_york entspricht der Standardzeitzone: GMT-5
Zeit der Zielzeitzone Amerika/New_york 2016-11-06 02:00:00
--------------------------
Das oben genannte Problem und die Lösung für die Konvertierung von Tageslichtsparenzeit basierend auf der Java -Zeitzone sind der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.