Java对世界不同时区timezone之间时间转换的处理方法

 更新时间:2020年07月17日 15:57:53   作者:杨博东的博客  
这篇文章主要介绍了Java对世界不同时区timezone之间时间转换的处理方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间。

一、关于时区的一些概念

1.1 什么是时区?

timezone,即由于世界各国家与地区经度不同,地方时也有所不同,按照经度将全球划分为24个时区。

时区有相应的英文字母缩写,例如GMT,UTC,CST等,常见的时区,具体参考:java时区理解

1.2 什么是夏令时?

通俗易懂的解释就是:夏令时开始的时候,大家在夜里2点把表往前调一个小时,即本来两点,被你手动调成了三点,如果你七点起床,那你那天晚上就会少睡一个小时,为什么这么做是因为夏天的时候7点其实天已经亮了,这样你到了第二天晚上8点(其实是之前的7点)就应该睡觉了,这样就可以节省电了,所以夏令时叫(Daylight Saving Time:DST),这篇文章讲了为什么要有夏令时?什么时候去修改表的时间?为什么是晚上2点修改?反对夏令时?还有人写paper说夏令时没什么用。

二、如何在不同时区之间转换时间

上部分分析了不同时区,还有夏令时的区别,即我们在转换时区的时候要考虑这两个问题,基本思路是:

  1. 获取到源时区相对于GMT的差距(考虑夏令时)。
  2. 获取到目的时区相对于GMT的差距(考虑夏令时)。
  3. 用当前的时间 - 源差距 + 目的差距

代码如下所示:

public class TimeZoneTransform {

 private static String dateTransformBetweenTimeZone(Date sourceDate, DateFormat formatter,
  TimeZone sourceTimeZone, TimeZone targetTimeZone) {
 Long targetTime = sourceDate.getTime() - sourceTimeZone.getRawOffset() + targetTimeZone.getRawOffset();
 return getTime(new Date(targetTime), formatter);
 }

 private static String getTime(Date date, DateFormat formatter) {
 return formatter.format(date);
 }

 private static String getTimeZone() {
 Calendar cal = Calendar.getInstance();
 // getOffset will access to offset and contains DaylightTime
 int timeZone = cal.getTimeZone().getOffset(System.currentTimeMillis()) / (3600000);
 if (timeZone >= 0) {
 return String.valueOf("+" + timeZone);
 }
 return String.valueOf(timeZone);
 }

 public static String getGMTTime(Date date, SimpleDateFormat formatter) {
 TimeZone srcTimeZone = TimeZone.getTimeZone("GMT" + getTimeZone());
 TimeZone destTimeZone = TimeZone.getTimeZone("GMT+8");

 return dateTransformBetweenTimeZone(date, formatter, srcTimeZone, destTimeZone);
 }

 public static void main(String[] args) {
 System.out.println(getGMTTime(new Date(System.currentTimeMillis()), new SimpleDateFormat()));
 }
}

三、Java中关于时间处理的类

关于Date,Calendar,LocalDate/LocalTime的介绍文章。

参考资料:

Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat

到此这篇关于Java对世界不同时区timezone之间时间转换的处理方法的文章就介绍到这了,更多相关Java不同时区timezone时间转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java selenium元素定位大全

    java selenium元素定位大全

    本文主要介绍java selenium元素定位,这里整理了selenium元素定位的相关资料,有兴趣的小伙伴可以参考下
    2016-08-08
  • 浅析Java中内部锁和显示锁的使用

    浅析Java中内部锁和显示锁的使用

    在java中锁主要两类,内部锁synchronized和显示锁java.util.concurrent.locks.Lock,本文将来和大家聊聊这两者的相关知识,需要的可以参考一下
    2023-06-06
  • 在spring-boot工程中添加spring mvc拦截器

    在spring-boot工程中添加spring mvc拦截器

    这篇文章主要介绍了在spring-boot工程中添加spring mvc拦截器,Spring MVC的拦截器(Interceptor)不是Filter,同样可以实现请求的预处理、后处理。,需要的朋友可以参考下
    2019-06-06
  • javaweb 项目初始配置的方法步骤

    javaweb 项目初始配置的方法步骤

    本文主要介绍了javaweb 项目初始配置的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Resttemplate中设置超时时长方式

    Resttemplate中设置超时时长方式

    这篇文章主要介绍了Resttemplate中设置超时时长方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java连接zookeeper的实现示例

    java连接zookeeper的实现示例

    ZooKeeper官方提供了Java API,可以通过Java代码来连接zookeeper服务进行操作,本文就来介绍一下java连接zookeeper的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Spring Cloud Hystrix线程池不足的解决方法

    Spring Cloud Hystrix线程池不足的解决方法

    这篇文章主要介绍了Spring Cloud Hystrix线程池不足的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • SpringBoot中RabbitMQ集群的搭建详解

    SpringBoot中RabbitMQ集群的搭建详解

    单个的 RabbitMQ 肯定无法实现高可用,要想高可用,还得上集群。这篇文章主要介绍了SpringBoot中RabbitMQ集群的两种模式的搭建:普通集群搭建和镜像集群搭建,需要的朋友可以参考一下
    2021-12-12
  • Java观察者设计模式详解

    Java观察者设计模式详解

    这篇文章主要为大家详细介绍了Java观察者设计模式,对观察者设计模式进行分析理解,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Java中数组协变和范型不变性踩坑记录

    Java中数组协变和范型不变性踩坑记录

    数组的协变性来源于数组的一个优势,这篇文章主要给大家介绍了关于Java中数组协变和范型不变性踩坑的一些内容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02

最新评论