1. Подготовка знаний
1. Дневное время сэкономить время Америки/new_york заключается в следующем: левая не правая
2016-3-13, с 02:00:00 до 2016-11-6, 02:00:00
2017-3-12, с 02:00:00 до 2017-11-5, 02:00:00
2. Идентификатор по часовым поясам с тремя буквами
Для совместимости с JDK 1.1.x также поддерживаются некоторые трехбуквенные идентификаторы часовых пояс (такие как «PST», «CTT», «AST»).
Тем не менее, их использование отбрасывается, потому что такая же аббревиатура часто используется в нескольких часовых поясах
Например, CST: У него есть 4 значения, Соединенные Штаты, Австралия, Китай, Куба Время
3. Стандарт
GMT: Зеленое среднее время Greenwich Стандартное время, использовалось в качестве стандартного эталона времени GMT+12-> GMT-12 до 1960 года
Диапазон Java8-GMT+18-> GMT-18
UTC: скоординированные универсальные временные координации времени, которое является более точным, чем GMT, и становится новым стандартом 1 января 1972 года; UTC, UTC+1, UTC+2 ... UTC+12, UTC-12 ... UTC-1
Java8 Диапазон UTC-18-> UTC+18
DST: Дневное время сэкономить относится к времени, когда часы выходят в течение часа летом, чтобы использовать солнечный свет ранее. Это называется летним временем в Великобритании;
В настоящее время более 110 стран используют время экономии летнего света;
В Китае он был реализован только в течение 6 лет с 1986 по 1992 год, и впоследствии он был отменен; причины следующие:
1. Китай имеет большой промежуток в восточном и западном направлениях и принимает единый Восточный восьмой округ, который несовместимо с Восточным и Западом, используя время спасения дневного света;
2. В высокоширотных районах время дневного и ночи сильно меняется зимой и летом; Это не очень значимо;
4. Это может быть использовано для указания, что Восточный Восьмой округ: GMT+8 или ETC/GMT-8 (только наоборот, почему? Потому что разработчики PHP считают, что Восточный восьмой район на 8 часов быстрее, чем стандартное время, и должно вычитаться на 8 часов, так что представление похоже на это. Различные контрольные объекты приводят к различным методам представления;
5. Как представить часовой пояс Китая
GMT+8
UTC+8
Азия/Харбин Харбин // Китайское стандартное время
Азия/Чунцин Чунцин // Китайское стандартное время
Азия/Чунгинг Чунцин // Китайское стандартное время
Азия/Урумки Урумки // Китайское стандартное время
Азия/Шанхай Шанхай (Восточный район 8) // Китайское стандартное время
КНР
Азия/Макао Макао // Китайское стандартное время
Гонконг Гонконг // Время Гонконга согласуется с стандартным временем Китая
Азия/Хонг_Конг Гонконг
Азия/Тайбэй Тайбэй (Тайвань) // Китайский стандарт Сингапур - это то же самое, что и время Китая;
Азия/Сингапур
Сингапур
6. Представление стандартных часовых поясов
универсальное глобальное время
UTC+0
UTC-0
GMT GMT
Gmt0 Gmt
И т. Д./GMT GMT
И т.д./GMT+0 Gmt
И т. Д./GMT-0 GMT
ETC/GMT0 GMT0 GMTS Стандартное время Примечание: GMT+XX (-xx) очень инклюзивна и может автоматически идентифицировать представление различного времени.
2. Преобразование часового пояса
Окружающая среда: до Java8
1. Преобразовать текущее время на указанный дисплей часового пояса
@Test public void test () бросает исключение {date a = new Date (); SimpleDateFormat sf = new SimpleDateFormat ("yyyy-mm-dd HH: MM: SS"); sf.settimezone (timezone.gettimezone ("America/new_york")); // конвертировать китайский часовой пояс в Нью -Йоркский часовой пояс системы США. }2. Указанное время преобразуется в указанный дисплей часового пояса
Могу ли я действительно конвертировать правильно? Кажется, есть ловушка, я посмотрел на реализацию онлайн
Я чувствую небольшую проблему со временем сэкономить дневное время
// Метод реализации 1: Дневное время сохранения не считается @Test public void test2 () Throws exection { /date DateTime = new SimpleDateFormat ("yyyy-mm-dd HH: MM: SS"). Parse ("2016-11-6 14:00:00"); 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 // Смещение часового пояса здесь исправлено, не существует времени сохранения дневного света, ошибка Long Chinesemills = DateTime.getTime () + york.getRawoffset ()-Zhong.getRawoffset (); Дата дата = новая дата (Chinesmills); System.out.println (new SimpleDateFormat ("yyyy-mm-dd HH: MM: SS"). Format (date)); } //Implementation method 2 You may recall that using Calendar.DST_OFFSET of the Calendar class //It is still not right to Calendar.DST_OFFSET This is dead @Testpublic void test3() throws Exception {//Date time =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-11-6 14:00:00");//Date time =new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"). Parse ("2016-11-6 1:00:00"); // date time = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"). Parse ("2016-11-6 1:00:00);//date-mm (" dryy-mm-mm-mm-м-м-м-м-м-м-м. HH: MM: SS "). Parse (" 2016-11-6 0:59:00 "); // дата времени = new SimpleDateFormat (" yyyy-mm-dd hh: mm: ss "). Parse (" 2016-11-6 1:59:59 "); HH: MM: SS "). Parse (" 2016-11-6 3:00:00 "); // 1. Получить местное время: календарь cal = calendar.getinstance (); cal.settime (время); cal.settimezone (timezone.gettimezone (" America/new_york "); // 2. cal.get (calendar.zone_offset)/(1000*60*60); // 3. До тех пор, пока в часовом поясе наблюдается время сэкономить летнее время, это 1 int dstoffset = cal.get (calendar.dst_offset)/(1000*60*60); System.out.println (ZoneOffset); System.out.println (DSTOFFSET); // 4. Difcuct от локального времени, чтобы получить время utclend.dd.d.d.d.d.d.d.d.ddeciser. -(ZoneOffset + dStoffset)); Cal.Add (Calendar.Hour, -(ZoneOffset + dStoffset)); дата времени 2 = cal.gettime (); System.out.println (new Sompledateformat ("yyyy -mm -dd HH: MM: ss"). // Метод реализации 3 подготовка // Разве не говорится, что Java автоматически обрабатывает время сэкономить летнее время для нас? // Let's first have a simple test to see if the daylight saving time judgment method is correct, and you can infer whether the automatic processing of java is correct//It is known that in 2016: America/New_York's daylight saving time time is: 2016-3-13 02:00:00 to 2016-11-06 01:59:59 @Test public void test4() throws Exception { //Convert to 0 time zone time as a reference point 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"); Дата D1 = sf.parse ("2016-03-13 6:59:59"); // Неверная дата D2 = SF.Parse ("2016-03-13 7:00:00"); // Истинная дата D3 = SF.Parse ("2016-11-6 6:59:59"); // Неверно дата D4 = SF.Parse ("2016-6-6: 00 /00"); Установил, что действительно нет никаких проблем в оценке начала дневного времени сэкономить, но в течение последнего времени дневного времени сэкономить, если быть точным, я оценил его за час // Посмотрите на проверку ниже, так почему это за час? Как это решить? В настоящее время я могу использовать только java8 d3 = sf.parse ("2016-11-6 5:59:59"); // true d4 = sf.parse ("2016-11-6 6:00:00"); // false Timezone York = timezone.gettimezone ("america/new_york"); // gmt-5 System.out.println («Использует ли целевой часовой пояс время сэкономить время:«+isdaylight (Йорк, D1)); System.out.println («Использует ли целевой часовой пояс время сэкономить:«+isdaylight (Йорк, D2)); System.out.println («Использует ли целевое часовое появление время сэкономить:«+isdaylight (Йорк, D3)); System.out.println («Использует ли целевой часовой пояс время сэкономить:«+isdaylight (Йорк, D4)); } // Судьи, независимо от того, частная логическая isdaylight (Zone Timezone, дата дата) {return Zone.UsenAylighttime () && Zone.Indaylighttime (date); } // Метод реализации 3 // По вышеуказанной проверке мы знаем, что суждение системы является проблематичным. Установив часовой пояс, программа автоматически обрабатывает время экономии дневного света. По крайней мере, я не могу понять, почему @testpublic void test5 () бросает исключение {// 13 часа друг от Китая + 8 New York-5 Changezone («2016-3-13 14:59:59», «PRC», «America/New_york», «Yyyy-MM-DD HH: MM: SS»); ///03-13 01:59:59-16-16-16-16-169-169-169-1613 гг. 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 "," yyyy-mm-mm-dd h.: mm.-16-11-11-11 01:59:59 // Этот результат неверен, это должно быть 02:00:00 changezone ("2016-11-6 14:00:00", "prc", "America/new_york", "yyyy-mm-dd hh: mm: ss"); // 2016-11-06 01:00:00 //////////c время, строка srcid, string destid, string pattern) throws parseexception {// Установить часовой зона часового пояса по умолчанию = часовой зона. Timezone.setDefault (Zone); Дата дата = new SimpleDateFormat (шаблон) .parse (время); // Установить целевой часовой пояс времени Destzone = Timezone.getTimeZone (destid); SimpleDateFormat SDF = new SimpleDateFormat (Pattern); // Установить часовой пояс, который будет отформатирован SDF.SetTimeZone (destzone); String Changtime = sdf.format (date); // Получить целевую систему часового пояса. }Резюме: Результаты, полученные при вышеуказанных методах реализации, несколько проблематичны для дневного времени.
Три, реализация Java8
1. Давайте сначала посмотрим на изменения часового пояса в Java 8
// доступный часовой пояс JDK8 @testpublic void testname1 () throws exception {// jdk8 по всему часовым поясам Set <string> ids = ZoneId.getaVailablezoneids (); String [] id1 = ids.toarray (new String [ids.size ()); String idss = arrays.tostring (id1). ",]"); System.out.println (ids.size ()); // 28 пропущенных часовых поясов перед строкой jdk8 [] id2 = timezone.getavailableids (); system.out.println (id2.length); // 623 // Узнайте, что для (String String Id: id2) {if (! Idss.contains (id+",")) {System.out.print (id+",");}} // Заключение: все часовые пояса в jdk8 все были удалены, // jdk8: // Есть часовые часы, которые легко, и // jdk8. Agt, Art, AST, BET, BST, CAT, CNT, CST, CTT, EAT, ECT, IET, IST, JST, MIT, NET, NST, PLT, PNT, PRT, PST, SST, VST, // Но эти короткие имена на самом деле все еще доступны, они просто недоступны в списке поддержки LocalDateTime = // LocalDateTime.Ofinstant (andAnt.now (), ZoneId.of (ZONEID.SHORT_IDS.GET ("PST")); System.out.println ("/ndate =" + date);}2. Как добавить информацию о часовом поясе или преобразовать ее
// localdate, localdatetime, мгновенная информация о часовом поясе @testpublic void testname3 () {localdate date = localdate.now (); // localdate Добавить информацию о часовых поясах // Метод 1 Зонов. date.atstartofday (ZoneID.SystemDefault ()); System.out.println (Zone); // Метод 2 LocalDate Date2 = LocalDate.now(ZoneId.of("GMT+0"));System.out.println(date2);System.out.println("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ZoneIme3 = localDateTime.now (clock.system (ZoneID.Of ("Gmt+0")); // Метод 4zodeDateTime ZoneneTime4 = ZonedDateTime.of (Time, ZoneId.of ("Gmt+0")); System.out.println (Zonetime); System.out.println (zonetime3); // Изменение System.out.println (Zonetime4); // Изменение System.out.println ("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------3. Как получить указанное время текущего времени (тест опущен)
// Получить указанный часовой пояс текущего времени, эталонный пункт: 0 часовой пояс Public LocalDateTime getCurrentzOneTime (Zoneid dest) {objects.requirenonlull (dest); LocalDateTime Time2 = localDateTime.now (clock.system (dest)); String Zonedesc = getzedesc (timezone.gettimezone (dest)); System.out.println (dest.getId ()+"соответствует стандартному часовому поясу:"+Zonedesc); System.out.println («целевой часовой пояс»+dest+"time"+time2.format (dateTimeformatter.ofpattern ("yyyy-mm-dd Hh: mm: ss"))); вернуть время2;} // Получить стандартный часовой пояс, Метод 1 // Метод перед JDK8, используйте частную статическую строку TimeZone GetZedESC (TimeZone Destzone) {Objects.Requirenonlull (destzone); int offset = destzone.getRawoffset () / (1000 * 60 * 60); if (offset <= 0) {return "gmt"+string.valueof (offset); } else {return "gmt +" + string.valueof (offset); }} // Метод Java8, метод 2, используйте Zonerules // Получить стандартное смещение часового пояса, Zonerules.getStandardoffset // Получить фактическое смещение часового пояса (полученное смещение изменится в соответствии с временем сохранения дневного света) // Получить стандартное смещение часового пояса (полученное смещение изменится в соответствии с Daylight Saving Time)/////////c ruge.getstandardoffset (zoneddatetime.now (dest) .toinstant ()). getId (); String s = standaroffset.split (":") [0]; int offset = integer.parseint (s); // Метод возврата 1: с часами и минутами // возврат "GMT"+StandardOffset; // Метод возврата 2: только с часами, если (смещение> 0) {return "gmt+"+offset;} else {return "gmt"+offset;}}4. Как получить указанное время указанного часового пояса
Начните реализовать задачу часового пояса, оставленную выше
Точно так же давайте сначала рассмотрим, правильным ли метод суда с сохранением времени с использованием Java8.
// Напишите из первых рук, чтобы определить, находится ли время в Соединенных Штатах в дневном сэкономите время общественного логического iSdaylighttime (LocalDateTime a) {Objects.Requirenonlull (a); LocalDateTime startDate = A.withmonth (3) .tolocaldate (). Ittime (2, 0); LocalDateTime startLightday = startDate.with (ThemeralAdjusters.DayOfWeekinMonth (2, dayOfweek.sunday)); // Обновление ноября LocalDateTime EndDate = A.Withmonth (11) .tolocaldate (). Attime (1, 59,59); LocalDateTime Endlightday = = enddate.with (themaraladjusters.dayofweekekinmonth (1, dayofweek.sunday)); if (a.isbefore (startlightday) || a.isafter (endlightday)) {system.out.println («Не в дневное время сохранения»+a); вернуть false;} system.out.println («в дневное время сохранение»; Java8 Уже есть готовый метод, который лучше, чем шахта // пройти в указанном времени и часовом поясе общественного лондона, isdaylighttime (LocalDateTime A, Zoneid Dest) {ZONEDDATETIME Z1 = A.ATZONE (DEST); // или передавать этот путь // ZONEDDATETIME Z2 = ZONEDDATETIME.OF (A, DEST); System.out.println (z1.format (datetimeformatter.ofpattern ("yyyy-mm-dd hh: mm: ss"))); Zonerules Rules = dest.getRules (); Boolean Flag = Rules.IsdayLightSavings (z1.toinstant ()); System.out.println (flag); вернуть флаг; }// Проверьте это и обнаружили, что метод дневного экономного времени Java8 полностью правильный
// Известно, что 2016: 2016: Америка/New_york Daylight Time Saving: 2016-3-13 с 02:00:00 до 2016-11-06 01:59:59 // (второе воскресенье марта и первое воскресенье ноября каждого года) @testpublic void testname () throws Exception {// LocalDateTime A1 = LocalDateTeTime. NNOW (); 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, 0,0); // isdaylighttime (a2); // isdaylighttime (a3); // isdaylighttime (a4); // isdaylighttime (a5); System.out.println ("================================================================================== =========================================================================== =========================================================================== =========================================================================== =========================================================================== =========================================================================== =========================================================================== ); // falseisDaylighttime (a3, ZoneId.of ("America/new_york")); // trueIsdaylighttime (a4, ZoneId.of ("America/new_york")); // trueIsdaylighttime (a5, ZoneId.of ("America/new_york"); // Fasle}Начните реализовывать:
Версия 1:
// Получить указанную точку отсчета времени для указанного времени: По умолчанию часовой поясной поясной поясной зоны вернуть getzongtime (время, null, dest); }
// Вы не можете вычесть из ZonedDatetime из 2 часовых поясов, потому что, как только вы указали здесь часовой пояс, это время является этим часовым появлением Public LocalDateTime GetZongtime (LocalDateTime Time, ZoneID SRC, ZoneId Dest) {// Сложность заключается в том, как найти смещение // По умолчанию временной зоны здесь есть Китай, а Соединенные штаты являются объединенными государствами. Это, вероятно, более подходит для объектов. ZONEDDATETIME Z1 = NULL; if (src == null) {z1 = time.atzone (ZoneID.SystemDefault ()); } else {z1 = time.atzone (src); } // Изменения ответа часового пояса во времени ZoneDateTime Z2 = Z1.WithzonesAmeInstant (dest); System.out.println (dest.getId ()+"соответствует стандартному часовому пояс:"+getzedEcc (timezone.gettimezone (dest))); System.out.println («Целевой часовой пояс»+dest+"time"+z2.format (datetimeformatter.ofpattern ("yyyy-mm-dd hh: mm: ss"))); System.out.println ("-----------------"); Время возвращения; }Тест заключается в следующем:
@Test public void test6 () бросает исключение {// Ожидается, что не будет в дневное время сэкономить время 2016-03-13 01:59:59 getzongtime (time4, zoned.of ("America/new_york")); // ожидается, что это будет в дневном сэкономите время 2016-03-13 03:00:00 LocalDateTime Time1 = localDateTime.of (2016, 3, 13, 15, 00, 00); getzongtime (time1, zoned.of ("America/new_york")); // Ожидаемый результат дневного света Время сохранения: 2016-11-06 01:59:59 // Я чувствую, что он снова потерпел неудачу, это должно быть 2016-11-06 02:59:59 // С другой стороны, метод до того, как Java8 обрабатывает конец дневного времени, в настоящее время является тем же, и судей на один час. 00:59:59, но метод суждения Java8 верен. Разве это не странно localDateTime Time2 = localDateTime.of (2016, 11, 6, 14, 59, 59); getzongtime (Time2, zoned.of ("America/new_york")); // не ожидается, что в дневное время сэкономить 2016-11-06 02:00:00 LocalDateTime Time3 = localDateTime.of (2016, 11, 6, 15, 00, 00); getzongtime (time3, zoned.of ("America/new_york")); }Итак, теперь я сомневаюсь, является ли этот результат систематической проблемой расчета, или я не понимаю обычаев Нью -Йорка?
Но я все еще могу получить желаемые результаты, используйте 2 метода:
withearlieroffsetatoverlap (), withlateroffsetatoverlap ()
Версия 2:
// Получите указанную справочную точку времени для указанного времени: Public LocalDateTime GetZongtime2 (LocalDateTime, ZoneID DEST) {Objects.Requirenonnull (dest); return getzongtime2 (время, Null, dest);} // version 2 publicdatetime getzontime2 (localdateTememe, destId -src, ZoneDID). OFFSET // Часовой пояс по умолчанию используется здесь, в Китае, в Соединенных Штатах Соединенные Штаты являются Соединенными Штатами, поэтому он, вероятно, более подходит для объектов. ZONEDDATETIME Z1 = NULL; if (src == null) {z1 = time.atzone (ZoneID.SystemDefault ()); } else {z1 = time.atzone (src); } // ZONEDDATETIME Z2 = Z1.withzonesameInstant (dest); // обрабатывать проблемы перекрытия долгие часы = продолжительность. Между (z2.withearlieroffsetatoverlap (), z2.withlateroffsetatoverlap ()). tohours (); z2 = z2.plushours (часы); System.out.println (dest.getId ()+"соответствует стандартному часовому пояс:"+getzedEcc (timezone.gettimezone (dest))); System.out.println («Целевой часовой пояс»+dest+"time"+z2.format (datetimeformatter.ofpattern ("yyyy-mm-dd hh: mm: ss"))); System.out.println ("-------------------"); Время возврата;}Тест: ОК
@Test public void test4 () бросает исключение {// Ожидается, что не будет в дневное время сэкономить время 2016-03-13 01:59:59 getzongtime2 (time4, zoneid.of ("America/new_york")); // ожидается, что это будет в дневном сэкономите время 2016-03-13 03:00:00 LocalDateTime Time1 = localDateTime.of (2016, 3, 13, 15, 00, 00); getzongtime2 (time1, zoneid.of ("America/new_york")); // Ожидается, что это будет время сэкономить дневное время 2016-11-06 02:59:59 LocalDateTime Time2 = localDateTime.of (2016, 11, 6, 14, 59, 59); getzongtime2 (time2, zoneid.of ("America/new_york")); // ожидается не в дневное время сэкономить 2016-11-06 02:00:00 LocalDateTime Time3 = localDateTime.of (2016, 11, 6, 15, 00, 00); getzongtime2 (Time3, zoneid.of ("America/new_york")); }результат:
America/new_york соответствует стандартному часовому поясу: GMT-5
Время целевого часового пояса America/new_york 2016-03-13 01:59:59
-----------------------
America/new_york соответствует стандартному часовому поясу: GMT-5
Время целевого часового пояса America/new_york 2016-03-13 03:00:00
-----------------------
America/new_york соответствует стандартному часовому поясу: GMT-5
Время целевого часового пояса America/New_york 2016-11-06 02:59:59
-----------------------
America/new_york соответствует стандартному часовому поясу: GMT-5
Время целевого часового пояса America/New_york 2016-11-06 02:00:00
-----------------------
Приведенная выше проблема и решение преобразования времени сэкономить летнее время на основе часового пояса Java - это все контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.