Java对世界不同时区timezone之间时间转换的处理方法
作者:杨博东的博客 发布时间:2023-11-08 13:19:30
最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间。
一、关于时区的一些概念
1.1 什么是时区?
timezone,即由于世界各国家与地区经度不同,地方时也有所不同,按照经度将全球划分为24个时区。
时区有相应的英文字母缩写,例如GMT,UTC,CST等,常见的时区,具体参考:java时区理解。
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时区处理之Date,Calendar,TimeZone,SimpleDateFormat
来源:https://blog.csdn.net/yangbodong22011/article/details/88930686


猜你喜欢
- 线程中start方法与run方法的区别在线程中,如果start方法依次调用run方法,为什么我们会选择去调用start方法?或者在java线
- <?xml version="1.0" encoding="UTF-8" ?> <
- 曾经有一个朋友问过我一个问题, 一张512*512 150KB PNG格式图片和一张512*512 100KB 压缩比是8的JP
- 前言作为一个后端程序员,网络连接这块是一个绕不过的砍,当你在做服务器优化的时候,网络优化也是其中一环,那么作为网络连接中最基础的部分-TCP
- 目录一、SpringBoot 使用 Nacos Config 实现多环境切换1. 现象2. 引入依赖3. 添加bootstrap.yaml配
- 今天想说的就是能够在我们操作数据库的时候更简单的更高效的实现,现成的CRUD接口直接调用,方便快捷,不用再写复杂的sql,带吗简单易懂,话不
- Spring流程Debug1.1 Spring测试环境搭建Spring模块概览,绿色是模块,Spring中八大模块,黑色表示该模块包含的ja
- ealsticsearch只是后端提供各种api,那么怎么直观的使用它呢?elasticsearch-head将是一款专门针对于elasti
- 本文实例为大家分享了Unity实现打砖块游戏的具体代码,供大家参考,具体内容如下效果演示1.创建墙1.1我们用预制体来统一管理墙方便以后对墙
- @requestBody的作用及说明1、@requestBody注解常用来处理content-type不是默认的application/x-
- 为了打造流畅的用户导航体验,我们不得不依赖智能手机最常见的一个功能:触摸。触摸改变应用程序的视图是现在最流行一种导航设计。在本文中,我们将经
- 一、Maven简介1. 什么是MavenMaven:是Apache提供的免费开源的项目管理工具。它提供了一个项目对象模型(pom.xml)、
- 前言飞行棋小游戏是学习C#以来,接触的第一个游戏项目,根据小杨老师的思路引导,自己的代码也实现了功能,经过思路的梳理,试着不借助代码自己去实
- 1.BIO1.1 简述BIO是同步阻塞IO,所有连接都是同步执行的,在上一个连接未处理完的时候是无法接收下一个连接1.2 代码示例在上述代码
- 一、引入先给出一个Num类的定义internal class Num{ public static int odd = 5000
- 前言在我们用户登录的时候,为了安全性考虑,会增加验证码的功能,这里采用的是google的kaptcha;spirngboot是轻便,独立,使
- 本文实例讲述了C#定义简单的反射工厂用法。分享给大家供大家参考。具体分析如下:首先,定义一个水果抽象类,代码如下:class Fruit{
- 本文实例讲述了Android使用onCreateOptionsMenu()创建菜单Menu的方法。分享给大家供大家参考,具体如下:Andro
- 1. Java对象结构Java对象结构包括三部分:对象头、对象体和填充字节,如图所示:对象头又包括三个字段:第一个字段叫作Mark Word
- 本文实例讲述了java实现递归文件列表的方法。分享给大家供大家参考。具体如下:FileListing.java如下:import java.