java中的时区转换

一、时区的说明

地球表面按经线从东到西,被划成一个个区域,规定相邻区域的时间相差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,先转为Date对象,再通过SimpleDateFormat对时区进行转换,并格式化成时间字符串输出。

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

java时区转换_java中的时区转换相关推荐

  1. java中子类与父类强制转换_java中父类强制转换成子类的错觉

    引言:父类引用指向子类对象在java中十分常见,比如: Object object=new a();//a是一个类名 但是有时候我们看见子类引用指向了父类对象,就是上边的反过来,比如 图片中圈1标识的 ...

  2. java万能编码转换_Java中的编码转换

    慕桂英3389331 CharsetDecoder 应该是您要寻找的东西,不是吗?许多网络协议和文件使用面向字节的字符集(例如ISO-8859-1(ISO-Latin-1))存储其字符.但是,Java ...

  3. java简拼_java中把汉字转换成简拼的实现代码

    public static void main(String[] args) { String str = null; str = "顾亮"; System.out.println ...

  4. Java中输出时区的缩写_Java中的时区转换小结

    时间加减 Date currentDate = new Date(System.currentTimeMillis()); Calendar cal = Calendar.getInstance(); ...

  5. java 时区 不正确_Java中的时区不匹配

    我在美国的Ubuntu服务器中运行一个Java应用程序,并配置了CEST时区. 如果我在终端中运行Date命令,它将以CEST Zone时间返回日期-这是完美的. 但是在Java中,如果我运行以下代码 ...

  6. java int 64 转换_Java中数据类型及其之间的转换

    Java中数据类型及其之间的转换 Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种: 1)int长度数据类型有:byte(8bits).short(16bits).int(32bi ...

  7. 时区 java 巴黎_java中的时区陷阱 - iasuna

    今天碰到一个很奇怪的问题,就是在调用SimpleDateFormat类的parse方法,得到了意外的结果. public static void main(String[] args) throws ...

  8. java数据类型转化_JAVA基本数据类型及其转换

    Java语言是一种强类型语言.这意味着每个变量都必须有一个声明好的类型.Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型.Java另外还提供大数字对 ...

  9. java类型之间的转换_java类型之间的转换

    string和int之间的转换? 字符串转换成数据 Java代码 String MyNumber ="1234"; intMyInt = Integer.parseInt(MyNu ...

  10. java把汉字转换url_url中汉字编码互相转换

    url中汉字编码互相转换 Java代码如下: package com.gjob.common; public class URLtoUTF8 { //转换为%E4%BD%A0形式 public sta ...

最新文章

  1. 剑指offer-二叉树的深度(递归)
  2. VTK:PolyData之TransformOrderDemo
  3. docker部署nessus+awvs
  4. c/c++面试试题(四)
  5. C#LeetCode刷题之#371-两整数之和(Sum of Two Integers)
  6. Python 包管理
  7. Sqlite中文排序
  8. java applet 浏览器_浏览器不能加载Java中Applet小程序
  9. 转:从框架看PHP的五种境界及各自的薪资待遇(仅限于二三线城市,一线除外)...
  10. 自己写的【手机号码归属地查询软件】
  11. Tools - UML绘图工具
  12. 服务器上打开PHP文件却出现下载界面或者502
  13. match函数的用法
  14. Linux系统入门学习
  15. 二进制学习-反跟踪技术
  16. 泛微OA流程插入JS代码块
  17. 中国十大域名圈高手 看看知道几个
  18. 加拿大电子计算机工程留学,【加中留学】加拿大计算机工程专业哪些大学比较好...
  19. vc常见问题108问-很有资料价值
  20. 【LeetCode】934. Shortest Bridge 解题报告(Python)

热门文章

  1. oracle转义chr,oracle特殊字符替换用chr
  2. MySQL备份的几种常用方法与恢复步骤
  3. echarts饼图南丁格尔玫瑰图属性设置
  4. Android中关于libs和JniLibs的各种坑
  5. Self-critical Sequence Training
  6. django2.2-视图层详解
  7. RocketMQ创建topic流程解析
  8. 动态规划 -- 活动时间问题
  9. NOIP 2017 列队 (线段树动态开点)
  10. SQL简体繁体转换函数