当前位置: 首页 > 编程笔记 >

Java时区转换及Date类实现原理解析

司马念
2023-03-14
本文向大家介绍Java时区转换及Date类实现原理解析,包括了Java时区转换及Date类实现原理解析的使用技巧和注意事项,需要的朋友参考一下

这篇文章主要介绍了Java时区转换及Date类实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、时区的说明

地球表面按经线从东到西,被划成一个个区域,规定相邻区域的时间相差1小时。在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时),跨过几个区域就加或减几小时 ,所以同一时刻在不同时区表示的时间是不一样的。

二、时间的表示

我们平时表示时间时通常是以一个格式化的字符串来表示一个时间,例如"2019-11-5 20:05"这个字符串表示的是2019年11月5日20点05分。但这里有一个隐含的前提,时区是自己当前所在的时区,即东八区的人看到这个时间认为是东八区的20:05,而东九区的人会认为是东九区的20:05,实际上这两个时间相差了一个小时。所以要正确的表示一个特定时刻,还要再加上时区信息,例如"2019-11-5 20:05 +8:00"这个字符串不管哪个时区的人看到都知道表示的是东八区的时间。

三、时间戳

时间戳表示的是一个时间间隔,从0时区来看,表示从"1970-1-1 00:00 +0:00"到现在(2019-11-5 12:05 +0:00)时刻的时间间隔,而从东八区来看表示从"1970-1-1 08:00 +8:00"到现在(2019-11-5 20:05 +8:00)的时间间隔。

间隔=现在-起点,因为现在和起点都相差了8小时,所以时间间隔是一样的,同样的道理,在任意时区中现在这一个时刻的时间戳都是一样的。

四、Date类和时间戳

java的Date类中实际保存的是某一个时刻的时间戳,所以同一时刻在任意时区获取到的Date对象都是一样的。当使用SimpleDateFormat格式化日期时,默认的会以当前的系统时区来格式化日期,所以同一时刻不同时区的人格式化日期得到的结果才会有时差。

所以以下代码,在东八区和东九区得到的输出相差了一个小时,但它们的Date对象实际上表示了同一个时刻

public class TestDate {
  public static void main(String[] args) {
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date=new Date(1572960924868L);//以时间戳来给定一个特定时刻
    System.out.println(sdf.format(date));
  }
}

五、java中的时区转换

SimpleDateFormat的对象可以设置时区,这样同一个Date对象就可以通过SimpleDateFormat来进行时区转换

  @Test
  public void test2(){
    Date date=new Date(1572960924868L);
    SimpleDateFormat sdf8=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    sdf8.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));//设置时区为东八区
    System.out.println("东八区的时间:"+sdf8.format(date));//输出格式化日期

    SimpleDateFormat sdf9=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    sdf9.setTimeZone(TimeZone.getTimeZone("GMT+9:00"));//设置时区为东八区
    System.out.println("东九区的时间:"+sdf9.format(date));//输出格式化日期
  }

输出的结果如下图

同一个时刻1572960924868,先转为Datehtml" target="_blank">对象,再通过SimpleDateFormat对时区进行转换,并格式化成时间字符串输出。

所以在实际的应用中,遇到需要存储时间的问题时,可以在数据库中存储时间对应的时间戳,这样在数据库存储时就不会有时区的问题,而在应用中需要用到时间时,就把这个时间戳转为Date,再通过SimpleDateFormat转换成需要的时区的时间。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍java时区转换的理解及示例详解,包括了java时区转换的理解及示例详解的使用技巧和注意事项,需要的朋友参考一下 一、时区的基本概念 GMT(Greenwich Mean Time),即格林威治标准时,是东西经零度的地方。人们将地球人为的分为24等份,每一等份为一个时区,每时区横跨经度15度,时间正好为1小时。往西一个时区,则减去一小时;往东一个时区,则加上一小时。中国在东经120度

  • 本文向大家介绍Java Lock接口实现原理及实例解析,包括了Java Lock接口实现原理及实例解析的使用技巧和注意事项,需要的朋友参考一下 1、概述 JUC中locks包下常用的类与接口图如下: 图中,Lock和ReadWriteLock是顶层锁的接口,Lock代表实现类是ReentrantLock(可重入锁),ReadWriteLock(读写锁)的代表实现类是ReentrantReadWri

  • 本文向大家介绍Java Unsafe类实现原理及测试代码,包括了Java Unsafe类实现原理及测试代码的使用技巧和注意事项,需要的朋友参考一下 Unsafe类介绍 第一次看到这个类时被它的名字吓到了,居然还有一个类自名Unsafe?读完本文,大家也能发现Unsafe类确实有点不那么安全,它能实现一些不那么常见的功能。 Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带

  • 本文向大家介绍Python动态类型实现原理及过程解析,包括了Python动态类型实现原理及过程解析的使用技巧和注意事项,需要的朋友参考一下 在python中,我们使用变量时,并没有声明变量的存在和类型。类型是在运行过程中自动决定的。 a = 3 python将会执行三步去完成上面这个请求。 1.创建一个对象代表3 2.创建一个变量a,如果a未创建。 3.将变量a与对象3相连接。 可以将变量a看作对

  • 本文向大家介绍Java Linkedlist原理及实例详解,包括了Java Linkedlist原理及实例详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java Linkedlist原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 定义:linkedlist属于链表结构,方便添加和删除元素,但查询不方便,适用于对收尾

  • 本文向大家介绍Python DES加密实现原理及实例解析,包括了Python DES加密实现原理及实例解析的使用技巧和注意事项,需要的朋友参考一下 加密流程 ​首先说一下置换的意思,比如说有5678这个字符串,置换表为2143,置换表中的数表示的是位置,所以字符串变成6587。所有的置换表在程序中。(S盒置换不一样,会另外说明) 密钥部分 把8位字符串密钥变成2进制(好像密钥只可以是8位,这一块我