JAVA UTC时间和本地时间

版权声明: https://blog.csdn.net/xu_coding/article/details/82355816

UT - 世界时

Universal Time
世界时是最早的时间标准。
在1884年,国际上将1s确定为全年内每日平均长度的1/8.64×104。以此标准形成的时间系统,称为世界时,即 UT1。
1972年国际上开始使用国际原子时标,从那以后,经过格林威治老天文台本初子午线的时间便被称为世界时,即UT2,
或称格林威治时间(GMT),是对地球转速周期性差异进行校正后的世界时。

TAI - 国际原子时

international atomic time
1967年第13届国际度量衡会议上通过一项决议,定义 1s 为铯-133原子基态两个超精细能级间跃迁辐射9,192,631,770周所持续的时间,这是利用铯原子振荡周期极为规律的特性。
现在用的时间就是1971年10月定义的国际原子时,是通过世界上大约200多台原子钟进行对比后,再由国际度量衡局时间所进行数据处理,得出的统一的原子时。

GMT - 格林尼治标准时间,格林威治平均时间

Greenwich Mean Time
由于地球轨道并非圆形,其运行速度又随着地球与太阳的距离改变而出现变化,因此视太阳时欠缺均匀性。
视太阳日的长度同时亦受到地球自转轴相对轨道面的倾斜度所影响。
为着要纠正上述的不均匀性,天文学家计算地球非圆形轨迹与极轴倾斜对视太阳时的效应。
平太阳时就是指经修订后的视太阳时。在格林尼治子午线上的平太阳时称为世界时(UT0),又叫格林尼治平时(GMT)。

UTC - 协调世界时

Universal Time Coordinated
UTC是国际无线电咨询委员会制定和推荐的,UTC相当于本初子午线(即经度0度)上的平均太阳时。
它是经过平均太阳时(以格林威治标准时间GMT)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,
计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。
其误差值必须保持在0.9秒以内,若大于0.9秒则由位于巴黎的国际地球自转事务中央局发布闰秒,使UTC与地球自转周期一致。
所以基本上UTC的本质强调的是比GMT更为精确的世界时间标准.它其实是个更精确的GMT.

我们一般不需要关注闰秒,java也没有提供对闰秒的处理方式。
我们通常需要使用时间戳这个概念,当需要处理的逻辑需要跨时区的时候,我们就不得不采用统一的时间方案,转化为UTC时间。或者直接存储时间戳。
一般来说:转化为UTC时间,
由于北京时间是东八区时间,比UTC时间快了8个小时 2018-09-03-10:00:00的北京时间转化为UTC时间就成了 2018-09-03-02:00:00。这样就每次同一存储时间为UTC时间,前端在展示的时候,将时间还原成当前时区的时间。
2、存取时间戳,时间戳是和时区无关的一个概念,同一个时刻,不同的时区的时间戳是一样的。举个例子 现在是北京时间 2018-09-03-10:00:00。也就是UTC时间2018-09-03-02:00:00。这个时刻的时间戳是某个值。当用户所处的时区发生变化的时候,比如用户从北京去伦敦(UTC时区),此时前端呈现时间的时候,就会因为时区的变化。时间自动变为2018-09-03-02:00:00。而当用户回到北京的时候,时间又会变成 2018-09-03-10:00:00。这样时间描述的都是那一刻。

public static void main(String[] args){
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println("UTC时间---》"+calendar.getTime().getTime());
        System.out.println(calendar.get(Calendar.YEAR)+
                "年"+calendar.get(Calendar.MONTH)+
                "月"+calendar.get(Calendar.DATE)+
                "日"+calendar.get(Calendar.HOUR_OF_DAY)+
                "时"+calendar.get(Calendar.MINUTE)+
                "分"+calendar.get(Calendar.SECOND)+"秒");
        calendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        System.out.println("北京时间---》"+calendar.getTime().getTime());
        System.out.println(calendar.get(Calendar.YEAR)+
                "年"+calendar.get(Calendar.MONTH)+
                "月"+calendar.get(Calendar.DATE)+
                "日"+calendar.get(Calendar.HOUR_OF_DAY)+
                "时"+calendar.get(Calendar.MINUTE)+
                "分"+calendar.get(Calendar.SECOND)+"秒");
        calendar.setTimeZone(TimeZone.getTimeZone("GMT+6"));
        System.out.println("东六区---》"+calendar.getTime().getTime());
        System.out.println(calendar.get(Calendar.YEAR)+
                "年"+calendar.get(Calendar.MONTH)+
                "月"+calendar.get(Calendar.DATE)+
                "日"+calendar.get(Calendar.HOUR_OF_DAY)+
                "时"+calendar.get(Calendar.MINUTE)+
                "分"+calendar.get(Calendar.SECOND)+"秒");
}


结果为:
UTC时间---》1535980042858
20188313722秒
北京时间---》1535980042858
20188321722秒
东六区---》1535980042858
20188319722

猜你喜欢

转载自blog.csdn.net/xu_coding/article/details/82355816