Java不同时区(timezone)之间时间转换
最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间。
一、关于时区的一些概念
1.1 什么是时区?
timezone,即由于世界各国家与地区经度不同,地方时也有所不同,按照经度将全球划分为24个时区。
时区有相应的英文字母缩写,例如GMT,UTC,CST等,常见的时区,具体参考:这里。
1.2 什么是夏令时?
通俗易懂的解释就是:夏令时开始的时候,大家在夜里2点把表往前调一个小时,即本来两点,被你手动调成了三点,如果你七点起床,那你那天晚上就会少睡一个小时,为什么这么做是因为夏天的时候7点其实天已经亮了,这样你到了第二天晚上8点(其实是之前的7点)就应该睡觉了,这样就可以节省电了,所以夏令时叫(Daylight Saving Time:DST),这篇文章讲了为什么要有夏令时?什么时候去修改表的时间?为什么是晚上2点修改?反对夏令时?还有人写paper说夏令时没什么用。
二、如何在不同时区之间转换时间
上部分分析了不同时区,还有夏令时的区别,即我们在转换时区的时候要考虑这两个问题,基本思路是:
- 获取到源时区相对于GMT的差距(考虑夏令时)。
- 获取到目的时区相对于GMT的差距(考虑夏令时)。
- 用当前的时间 - 源差距 + 目的差距。
代码如下所示:
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不同时区(timezone)之间时间转换的更多相关文章
- Java中数据类型及其之间的转换
Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...
- Java中数据类型及其之间的转换(转)
Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...
- Java 时区之间时间转换
SimpleDateFormat foo = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); System.out.println(&qu ...
- java对世界各个时区(TimeZone)的通用转换处理方法
在进行国际性软件项目开发的过程中,有时候会碰到一些比较特殊的要求.比如:比如说,你做的是个购物网站(假设服务器放在中国上海),当全世界客户在你的网站上下订单买东西后,往往希望看到客户所在地下单时间,比 ...
- Java集合 Json集合之间的转换
1. Java集合转换成Json集合 关键类:JSONArray jsonArray = JSONArray.fromObject(Object obj); 使用说明:将Java集合对象直接传进JSO ...
- java中进制之间的转换
//十进制转其他进制 Integer.toHexString(10); //将10转换为十六进制,返回字符串类型 Integer.toOctalString(10); //将10转为八进制,返回字符串 ...
- 简单Java类与XML之间的转换
需要的jar包:xmlpull_1_0_5.jar,xstream-1.4.1.jar) 1.工具类XstreamUtil package com.learn.util; import com.tho ...
- Java常用工具类之时间转换
import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; ...
- 通过JAXB完成Java对象与XML之间的转换
Java对象转换XML的过程叫marshal. XML转换到Java对象的过程叫unmarshal. 一.Java对象转化为XML 这里省略getter和setter方法 通过标注@XMLRootEl ...
随机推荐
- 华为云计算IE面试笔记-桌面云中的用户组、虚拟机模板、模板虚拟机、虚拟机组和桌面组的关系及区别。发放完整复制和链接克隆虚拟机时,步骤有什么区别,要怎么选择桌面组?
概念解释: 模板虚拟机:FC上创建的裸虚拟机,用于制作不同类型的虚拟机模板. 虚拟机模板:用于创建虚拟机的模板,对裸虚拟机(模板虚拟机)进行配置或自定义安装软件后,转为模板.虚拟机模板类型有完整复制, ...
- java eclipse 使用随笔
1,无法import java.awt. 等各种文件,解决办法:(在module-info.java文件中加入requires java,desktop这句话)
- 安装VM-TOOLS,解压tar包时提示目录磁盘空间不足
在虚拟机里安装了ubuntu-18.04.4-desktop-amd64,安装VM-TOOLS,解压tar包时提示目录磁盘空间不足. 解决方法一: 打开terminal,输入:sudo apt ins ...
- centos7安装sonarqube与使用
https://www.cnblogs.com/mascot1/p/11179767.html https://blog.csdn.net/superbfly/article/details/1039 ...
- 第三方api接口
做为一个软件测试工程师,你要学习接口测试,需要练习,那么就要有调用的api,可以参考以下的文章. 国内7款API供应平台功能对比及详细介绍 https://blog.csdn.net/ishxiao/ ...
- redis小结 1-1
1.1什么是resis Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 1.2Redis 与其他 key - value 缓存产品有以下三个特点 Redis支持 ...
- P1758-[NOI2009]管道取珠【dp】
正题 题目链接:https://www.luogu.com.cn/problem/P1758 题目大意 给出一个大小为\(n\)和一个大小为\(m\)的栈,每次选择一个栈弹出栈顶然后记录这个字母,求所 ...
- 小记SpringMVC与SpringBoot 的controller的返回json数据的不同
近期由于项目的改动变更,在使用springmvc和springboot测试的时候发现一个有趣的现象 1.springmvc的controller使用@ResponseBody返回的仅仅是json格式的 ...
- VMware vSphere 7 Update 3 下载
请访问原文链接:https://sysin.org/blog/vmware-vsphere-7-u3/,查看最新版.原创作品,转载请保留出处. vSphere 7 Update 3 已经宣布可用,即将 ...
- Springboot在有锁的情况下如何正确使用事务
1. 概述 老话说的好:想要赚钱,就去看看有钱人有什么需求,因为有钱人钱多,所以赚的多. 言归正传,在Java项目的研发中,"锁"这个词并不陌生,最经典的使用场景是商品的超卖问题. ...