Java时区转换意味着什么?
我住在委内瑞拉,在过去的10年里,我们面临着两个重大变化 这段代码是在Java7更新76中运行的Java时区转换意味着什么?,java,timezone,Java,Timezone,我住在委内瑞拉,在过去的10年里,我们面临着两个重大变化 这段代码是在Java7更新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
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更新121当然在2016年底我们有最新的变化
sun.util.calendar.ZoneInfo[id="America/Caracas",offset=-14400000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]
我想知道转换是什么意思,文档中说的是这样的
不能使用自定义时区ID指定夏令时转换计划
但在委内瑞拉,不进行节俭,我想知道这种特殊情况下的过渡意味着什么?是否意味着历史上格林尼治标准时间的总变化?过渡是一个数组,您只得到它的长度(在本例中为6) 我引述: 此数组描述此时区的GMT偏移的转换, 包括原始偏移更改和夏令时更改。A. 长整数由四位字段组成。最高有效位为52位 字段表示从公历开始的转换时间(以毫秒为单位) 1970年1月1日,00:00:00 GMT。保留下一个4位字段并 必须为0。下一个4位字段是 过渡处的日光节约量。如果该值为零,则 意味着没有夏时制,索引值不为零。起码 有效4位字段是总GMT偏移量[]的索引值 在过渡处偏移。如果这个时区不观测日光 节省时间,而且过去从未更改过任何GMT偏移量,这 值为空 在这里,在
转换
字段上有这样的注释:
此数组描述此时区的GMT偏移的转换,包括原始偏移更改和夏令时更改。长整数由四位字段组成
虽然委内瑞拉没有DST,但它与GMT的偏移量确实有一些变化。使用Linux命令zdump-v America/Caracas,您可以得到以下输出:
America/Caracas-9223372036854775808=NULL
美洲/加拉加斯-9223372036854689408=空
美国/加拉加斯星期三1月1日04:27:43 1890 UT=周二12月31日23:59:59 1889 LMT isdst=0 gmtoff=-16064
美国/加拉加斯星期三1月1日04:27:44 1890 UT=星期三1月1日00:00:04 1890 CMT isdst=0 gmtoff=-16060
美国/加拉加斯周一2月12日04:27:39 1912 UT=太阳2月11日23:59:59 1912 CMT isdst=0 gmtoff=-16060
美国/加拉加斯周一2月12日04:27:40 1912 UT=太阳2月11日23:57:40 1912 VET isdst=0 gmtoff=-16200
美国/加拉加斯星期五1月1日04:29:59 1965 UT=周四12月31日23:59:59 1964 VET isdst=0 gmtoff=-16200
美国/加拉加斯1965年1月1日星期五04:30:00 UT=1965年1月1日星期五00:30:00兽医isdst=0 gmtoff=-14400
美国/加拉加斯太阳12月9日06:59:59 2007 UT=太阳12月9日02:59:59 2007 VET isdst=0 gmtoff=-14400
美国/加拉加斯太阳2007年12月9日07:00:00 UT=太阳2007年12月9日02:30:00 VET isdst=0 gmtoff=-16200
美国/加拉加斯太阳2016年5月1日06:59:59 UT=太阳2016年5月1日02:29:59 VET isdst=0 gmtoff=-16200
美国/加拉加斯太阳2016年5月1日07:00:00 UT=太阳2016年5月1日03:00:00 VET isdst=0 gmtoff=-14400
美洲/加拉加斯9223372036854689407=空
美洲/加拉加斯9223372036854775807=空
观看右侧的gmtoff
列。每对线代表一个过渡。你可以看到,10多年前有更多的转变
实际上,Java的做法有点不同。它只记录1900年以来的过渡,因此不包括1890年的偏移量。但它在未来增加了一个虚拟过渡。您可以通过以下代码(Java 8)看到实际的转换:
输出为:
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
很好,但这意味着什么,我的朋友。美国/加拉加斯太阳12月9日06:59:59 2007 UT=Sun Dec 9 02:59:59 2007 VET isdst=0 gmtoff=-14400美国/加拉加斯太阳12月9日07:00:00 2007 UT=Sun Dec 9 02:30:00 2007 VET isdst=0 gmtoff=-16200仅一秒?@chiperortiz在zdump输出中,每对线代表一个过渡-之前的偏移和之后的偏移,这就是第二个的区别。Java做的有点不同。我只包含了zdump输出,以向您展示过去有更多的转换。一般来说,我们使用“转换”一词来描述局部“墙时间”具有不连续性的情况。不连续性是将时间向前还是向后移动,或者是由于夏令时,或者是标准时间的变化,都无关紧要。它只是在某一点上采取一些措施来修改本地时钟。您将在所有技术平台和技术之外的时间保持中找到这个术语。
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();
}
}
}