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中的时区转换的更多相关文章

  1. java中汉字自动转换成拼音

    java中汉字自动转换成拼音 1.需要下载jar包 pinyin4j.2.5.0.jar ,加入到WEB-INF下的lib里边,右键add to bulid path. 2.[代码]PinYinUti ...

  2. java中调用kettle转换文件

    java中调用kettle转换文件 通过命令行也能够调用,然后java中调用命令行代码也能够.这样没有和java代码逻辑无缝集成.本文说明kettle5.1中假设通过其它API和java代码无缝集成: ...

  3. Java中Date时区的转换

    1.Date中保存的是什么?  在java中,只要我们执行 Date date = new Date(); 就可以得到当前时间.如: Date date = new Date(); System.ou ...

  4. 填坑:Java 中的日期转换

    我们之前讨论过时间,在Java 中有一些方法会出现横线?比如Date 过期方法. 参考文章:知识点:java一些方法会有横线?以Date 过期方法为例 Java中的日期和时间处理方法 Date类(官方 ...

  5. Java中数据类型默认转换和强制类型转换

    默认转换: a:由低到高一次为:(byte   short    char  )---int ---long ---float --- double b:注意:byte   short    char ...

  6. JAVA中时间格式转换

    1.将任意日期格式的字符串转换为指定格式的字符串 //默认格式 String s1 = "20190110133236"; //给定格式 String s2 = "201 ...

  7. java中字符串编码转换

    Java 正确的做字符串编码转换 字符串的内部表示? 字符串在java中统一用unicode表示( 即utf-16 LE) , 对于 String s = "你好哦!"; 如果源码 ...

  8. Python3中datetime时区转换介绍与踩坑

    最近的项目需要根据用户所属时区制定一些特定策略,学习.应用了若干python3的时区转换相关知识,这里整理一部分记录下来. 下面涉及的几个概念及知识点: GMT时间:Greenwich Mean Ti ...

  9. java中数据类型的转换

    数据类型的转换,分为自动转换和强制转换. 自动转换是程序执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换 强制转换必须在代码中声明,转换顺序不受限制 自动数据类 ...

随机推荐

  1. MongoDB 基础教程CURD帮助类

    最近两天在学习MongoDB,强大的文档数据库.给我最大的感觉就是相比于SQL或者MSQ等传统的关系型数据库,在使用和配置上真的是简化了很多.无论是在集群的配置还是故障转移方面,都省去了许多繁琐的步骤 ...

  2. SUSE CaaS Platform 4 - 简介

    SUSE CaaS Platform KUBERNETES - 面向企业 SUSE CaaS Platform 是一款企业级容器管理解决方案,可让 IT 和 DevOps 专业人士更轻松地部署.管理和 ...

  3. ArcGISEngine中GP工具奇怪错误问题error(s) have been detected for layer

    运行时环境:使用CADToGeodatabase工具执行DWG文件转gdb过程,多次执行(即执行完一个dwg转gdb,再执行另一个dwg转gdb),执行失败 错误描述:首先执行CADToGeodata ...

  4. Django基础五之django模型层之关联管理器

    class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: ForeignKey关系的“另一边”.像这样: 1 ...

  5. ping通谷歌后发送QQ邮件通知

    前言   国庆期间,据说是为了防止有人在重大节日发表不正当言论,很多可以kxsw的ip都被封了,可是什么时候才会解封呢,不能没事就去ping一下吧,所以我写了个定时任务,定时ping谷歌服务器,如果p ...

  6. 设计模式----行为型模式之观察者模式(Observer Pattern)

    下面是阅读<Head First设计模式>的笔记. 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. JDK API内置机制 ...

  7. 我的Java秋招面经大合集

    阿里面经   阿里中间件研发面经 蚂蚁金服研发面经 岗位是研发工程师,直接找蚂蚁金服的大佬进行内推. 我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer. 然后我也参加了 ...

  8. PHP 插入排序 -- 折半查找

    1. 折半查找  -- Binary Insertion Sort 时间复杂度 : O(n^2) 适用条件 : 相对直接插入排序,减少了数值的比较次数.适用于需要排序的数码比较少的情况. <?p ...

  9. LeetCode初级算法--树01:二叉树的最大深度

    LeetCode初级算法--树01:二叉树的最大深度 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...

  10. 利用window10的Linux子系统实现docker的安装使用

    先参照 此博客 点这里 我在执行 apt installdocker.io 命令时,不能正确的安装 docker client 所以我找了下面的命令,然后执行 docker version 成功了 辅 ...