美文网首页
JDK不同版本时区问题

JDK不同版本时区问题

作者: 少泉一郎 | 来源:发表于2021-05-10 10:27 被阅读0次

1、问题描述

项目中通过时区名称转换为本地时间(JDK11.0.1),与数据库(Postgresql12.3)转换出来的本地时间相差一小时。当时相差一小时就怀疑是夏令时的问题造成的,但百度也没有找到处理办法,后面直接去jdk官网去看终于给找到原因。这是由于jdk时区库没有更新(lib/tzdb.dat),因为时区每年都会更新很多次,如果下载到本地的jdk的这个库没有更新,就有可能造成某些时区的时间转换有问题。

2、测试代码

Postgresql根据时区获取本地时间:

SELECT NOW() AT TIME ZONE 'America/Santiago';

Java根据时区名称转换本地时间(在JDK的时区库没有更新的情况下JDK11.0.1与JDK11.0.11执行的结果都还不一样,其它版本的也会存在该问题):

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class TimeZoneTest{
    public static void main(String[] args){
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String zoneName = "America/Santiago";
        ZoneId zoneId;
        try{
            zoneId = ZoneId.of(zoneName);
        }catch(Exception e){
            zoneId = ZoneId.of(ZoneId.SHORT_IDS.get(zoneName));
        }
        ZoneOffset offset = zoneId.getRules().getOffset(Instant.now());
        String time = OffsetDateTime.now().toInstant().atOffset(offset).format(fmt);
        System.out.println(String.format("\n\ntzName : %s, offset : %s, time : %s\n\n",offset,offset.getTotalSeconds(),time));
    }
}

3、查看JDK本地时区库版本

下载官方的tzupdater工具,完成后执行以下命令查看(tzupdater说明文档):

java -jar tzupdater.jar -V

4、更新JDK本地时区库

java -jar tzupdater.jar -l

完成后再执行第2点中的测试代码,这时转换的本地时间就正常了。

5、其它相关资源

JDK不同版本对应的时区库版本地址:https://www.oracle.com/java/technologies/tzdata-versions.html

JDK时区相关的文档地址:https://www.oracle.com/java/technologies/javase/timezones.html

时区库地址:https://www.iana.org/time-zones

相关文章

  • JDK不同版本时区问题

    1、问题描述 项目中通过时区名称转换为本地时间(JDK11.0.1),与数据库(Postgresql12.3)转换...

  • JDK时区问题

    今天碰到一个大坑,弄了快一个小时才解决掉; 一个管理台后端服务,用docker隔离了三个容器,oracle,ngi...

  • Java中的HashMap原理分析

    不同版本的JDK的HashMap的底层实现均有所不同 JDK各个版本的源码查看 各个版本的源码查看:https:/...

  • JDK版本问题

    虽然DVM也是用Java编程语言,Dalvik虚拟机和一般JAVA虚拟机(Java VM)并不兼容,他们两个的区别...

  • IDEA JDK

    JDK的版本很多,各种项目使用的版本不同,在IDEA中设置JDK的位置也有好几个,如果设置不对,就会出现JDK版本...

  • 图解java.util.concurrent源码(二)Threa

    JDK版本 我这里依据的JDK版本如下: 如果你的版本和我不同,看到的源码可能有细微的不同。 基础知识 本博文的重...

  • 浅析Java程序的执行过程

    一、jdk内容概述 当安装好jdk后(本示例jdk版本为11.0.1,不同版本,目录有细微差别,但bin目...

  • 2020-01-06 Maven依赖 易错!

    这个问题出过好多次了!一定要切换JDK的版本!一定要切换JDK的版本!一定要切换JDK的版本! 今天的问题整了一晚...

  • 部署Angular+Spring Boot项目到centos主机

    一.搭建环境 1.安装jdk 使用yum -y list java*命令,将会列出不同版本jdk, 选择合适版本...

  • Sonarqube安装与配置

    一、安装并配置好JDK 根据soanr版本的不同,对JDK的版本要求不同,这个可以在sonar的官网看到,我这次安...

网友评论

      本文标题:JDK不同版本时区问题

      本文链接:https://www.haomeiwen.com/subject/wwbbdltx.html