Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java时区转换意味着什么?_Java_Timezone - Fatal编程技术网

Java时区转换意味着什么?

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

我住在委内瑞拉,在过去的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 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();
        }

    }
}