2017-01-18 6 views
2

Я живу в Венесуэле за последние 10 лет, когда мы столкнулись с изменениями 2 GMT.Java часовой пояс, что означает переходы?

Этот код был запущен в Java 7 обновлений 76

System.out.println(TimeZone.getTimeZone("America/Caracas")); 

который печатает

sun.util.calendar.ZoneInfo[id="America/Caracas",offset=-16200000,dstSavings=0,useDaylight=false,transitions=5,lastRule=null] 

И это с последним JDK Java 8 Update 121, конечно, в конце 2016 года мы имеем последнее изменение.

sun.util.calendar.ZoneInfo[id="America/Caracas",offset=-14400000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null] 

Мне было интересно, какие переходы означают, что документация говорит что-то вроде.

Нет экономию график перехода летнего времени не может быть определен с пользовательским временной зоной ID

Но в Венесуэле не день экономии сделаны Интересно, что переходы средства для этого конкретного случая это означает, как общее изменение Gmt в истории или так?

+0

В общих чертах, мы используем слово «переход», чтобы описать, когда местная «стена -time "имеет разрыв. Не имеет значения, перемещает ли перерыв время вперед или назад, или это связано с летним временем или с изменением стандартного времени. Это просто точка, в которой предпринимаются некоторые действия для изменения локальных часов. Вы найдете эту терминологию во времени, во всех технологических платформах и вне технологии. –

ответ

3

ZoneInfo class имеет этот комментарий на transitions поле:

Этот массив описывает переходы GMT смещения этого часового пояса, в том числе как сырья офсетных изменений и экономии дневного света временные изменения. Длинное целое состоит из четырех битовых полей.

Хотя в Венесуэле нет DST, у нее были некоторые изменения в ее смещении от GMT. С помощью команды Linux zdump -v America/Caracas, вы получите следующий результат:

America/Caracas -9223372036854775808 = NULL 
America/Caracas -9223372036854689408 = NULL 
America/Caracas Wed Jan 1 04:27:43 1890 UT = Tue Dec 31 23:59:59 1889 LMT isdst=0 gmtoff=-16064 
America/Caracas Wed Jan 1 04:27:44 1890 UT = Wed Jan 1 00:00:04 1890 CMT isdst=0 gmtoff=-16060 
America/Caracas Mon Feb 12 04:27:39 1912 UT = Sun Feb 11 23:59:59 1912 CMT isdst=0 gmtoff=-16060 
America/Caracas Mon Feb 12 04:27:40 1912 UT = Sun Feb 11 23:57:40 1912 VET isdst=0 gmtoff=-16200 
America/Caracas Fri Jan 1 04:29:59 1965 UT = Thu Dec 31 23:59:59 1964 VET isdst=0 gmtoff=-16200 
America/Caracas Fri Jan 1 04:30:00 1965 UT = Fri Jan 1 00:30:00 1965 VET isdst=0 gmtoff=-14400 
America/Caracas Sun Dec 9 06:59:59 2007 UT = Sun Dec 9 02:59:59 2007 VET isdst=0 gmtoff=-14400 
America/Caracas Sun Dec 9 07:00:00 2007 UT = Sun Dec 9 02:30:00 2007 VET isdst=0 gmtoff=-16200 
America/Caracas Sun May 1 06:59:59 2016 UT = Sun May 1 02:29:59 2016 VET isdst=0 gmtoff=-16200 
America/Caracas Sun May 1 07:00:00 2016 UT = Sun May 1 03:00:00 2016 VET isdst=0 gmtoff=-14400 
America/Caracas 9223372036854689407 = NULL 
America/Caracas 9223372036854775807 = NULL 

наблюдать за gmtoff колонке справа. Каждая пара строк представляет собой один переход. Вы можете видеть, что было больше переходов, более 10 лет назад.

Java делает это несколько иначе, на самом деле. Он записывает только переходы с 1900 года, поэтому смещение 1890 не включено. Но в будущем он добавляет один фиктивный переход. Вы можете увидеть фактические переходы с помощью следующего кода (Java 8):

import java.lang.reflect.Field; 
import java.time.Instant; 
import java.util.TimeZone; 

public class SimpleTest { 

    public static void main(String[] args) { 
     TimeZone tz = TimeZone.getTimeZone("America/Caracas"); 

     Field f = null; 
     try { 
      f = tz.getClass().getDeclaredField("transitions"); 
      f.setAccessible(true); 
      long[] transitions = (long[]) f.get(tz); 
      f = tz.getClass().getDeclaredField("offsets"); 
      f.setAccessible(true); 
      int[] offsets = (int[]) f.get(tz); 

      for (long transition : transitions) { 
       Instant transitionInstant = Instant.ofEpochMilli(transition >> 12); 
       int offset = offsets[(int)transition & 0xF]; 
       System.out.println(transitionInstant + " : " + offset); 
      } 
     } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

Выход является:

1900-01-01T00:00:00Z : -16060000 
1912-02-12T04:27:40Z : -16200000 
1965-01-01T04:30:00Z : -14400000 
2007-12-09T07:00:00Z : -16200000 
2016-05-01T07:00:00Z : -14400000 
2037-01-01T04:00:00Z : -14400000 
+0

большой, но что это значит, мой друг. Америка/Каракас Sun Dec 9 06:59:59 2007 UT = вс 9 дек 02:59:59 2007 VET isdst = 0 gmtoff = -14400 Америка/Каракас ВС 9 декабря 07:00:00 2007 UT = вс 9 декабря 02 : 30: 00 2007 VET isdst = 0 gmtoff = -16200 всего одна секунда? – chiperortiz

+0

@chiperortiz. В выводе zdump каждая пара строк представляет собой переход - смещение * перед * и смещение * после *, так что это разница второго. Java делает это несколько иначе. Я включил только вывод zdump, чтобы показать вам, что в прошлом было больше переходов. – RealSkeptic

1

Переходы является массив, и вы получите только длину его (в данном случае 6)

цитирую:

Этот массив описывает переходы GMT смещения этого часового пояса, включая как необработанные изменения смещения, так и переход на летнее время. A длинное целое состоит из четырех битовых полей. Наиболее значимое 52-битовое поле представляет собой время перехода в миллисекундах от григорианского 1 января 1970 года, 00:00:00 по Гринвичу. Следующее 4-битовое поле зарезервировано и должно быть 0. Следующее 4-битовое поле является значением индекса для смещений [] для суммы перехода на летнее время при переходе. Если это значение равно нулю, то означает, что нет дневного света, а не значение индекса. Наименьшее значительное 4-битовое поле является значением индекса для смещений [] для общего количества GMT смещения при переходе. Если этот часовой пояс не учитывает дневной свет , это экономит время и никогда не меняло никаких смещений GMT в прошлом, это значение равно null.

и здесь quelle