源码分析:jdk获取默认时区的风险和最佳实践(代码片段)

小虚竹 小虚竹     2022-12-19     280

关键词:

技术活,该赏
点赞再看,养成习惯

源码分析

TimeZone.getDefault() 是JDK自带的方法,所属包:java.util;方法返回此主机(程序运行的主机)的默认时区

    //TimeZone类
   public static TimeZone getDefault() 
        return (TimeZone) getDefaultRef().clone();
    

我们来看下默认时区是怎么取值的

1、java.util.TimeZone类中getDefault方法的源代码显示,它最终是会调用sun.util.calendar.ZoneInfo类的getTimeZone 方法。这个方法为需要的时间区域返回一个作为ID的String参数。

2、时间ID zoneID的获取方式:先从JVM中的user.timezone变量中读取,如果读不到,再读取系统的默认时区

zoneID = getSystemTimeZoneID(javaHome);

   /**
     * Gets the platform defined TimeZone ID.
     **/
    private static native String getSystemTimeZoneID(String javaHome);

看到这个native ,说明已经挖到核心了,到了这一步,还是不清楚是怎么获取系统的默认时区的,那怎么办,JDK代码只能跟到这里。

转战OpenJDK,源码下载方式:https://gitee.com/mirrors/openjdk

传送门:要探索JDK的核心底层源码,那必须掌握native用法

3、如果再读不到,就用默认的 GMT_ID = "GMT"

使用默认时区的风险

当JVM中的user.timezone变量没有设值,由上面的源码分析可知,会读取当前系统的默认时区。

风险就出在这里,如果安装系统时时区没有设置好,会导致程序获取的默认时区跟我们想要的不一样,这时候程序就会出现异常。

避免风险最佳实践

JVM中的user.timezone变量中设置时区

推荐相关文章

hutool日期时间系列文章

1DateUtil(时间工具类)-当前时间和当前时间戳

2DateUtil(时间工具类)-常用的时间类型Date,DateTime,Calendar和TemporalAccessor(LocalDateTime)转换

3DateUtil(时间工具类)-获取日期的各种内容

4DateUtil(时间工具类)-格式化时间

5DateUtil(时间工具类)-解析被格式化的时间

6DateUtil(时间工具类)-时间偏移量获取

7DateUtil(时间工具类)-日期计算

8ChineseDate(农历日期工具类)

9LocalDateTimeUtil(JDK8+中的@link LocalDateTime 工具类封装)

10TemporalAccessorUtil@link TemporalAccessor 工具类封装

其他

要探索JDK的核心底层源码,那必须掌握native用法

万字博文教你搞懂java源码的日期和时间相关用法

jdk获取默认时区风险(代码片段)

源码分析TimeZone.getDefault()是JDK自带的方法,所属包:java.util;方法返回此主机(程序运行的主机)的默认时区//TimeZone类publicstaticTimeZonegetDefault()return(TimeZone)getDefaultRef().clone();2021年最新阿里P7Java面试 查看详情

jdk获取默认时区风险(代码片段)

 源码分析TimeZone.getDefault()是JDK自带的方法,所属包:java.util;方法返回此主机(程序运行的主机)的默认时区//TimeZone类publicstaticTimeZonegetDefault()return(TimeZone)getDefaultRef().clone();我们来看下默认时区是怎么取值的1、ja... 查看详情

《jdk源码分析》相关系列目录(java小虚竹)

...赞👍收藏⭐再看,养成习惯最近抽空整理了《JDK源码分析》相关系列的文章,下面是《JDK源码分析》相关系列的目录,方便查阅。若文章有错误或纰漏,请不吝指正。谢谢入门需知要探索JDK的核心底层源码... 查看详情

获取 iPhone 与 iPod Touch 时区的最佳实践

】获取iPhone与iPodTouch时区的最佳实践【英文标题】:bestpracticetoobtaintimezoneforiPhonevsiPodTouch【发布时间】:2010-04-1007:47:13【问题描述】:我正在创建一个需要用户当前时区的应用。如果正在使用的设备是iPhone,并且用户将时区设置... 查看详情

什么是分析和性能测试 python 代码的最佳实践和工具? [复制]

】什么是分析和性能测试python代码的最佳实践和工具?[复制]【英文标题】:Whatsarebestpracticesandtoolsforprofilingandperformancetestingpythoncode?[duplicate]【发布时间】:2012-02-2300:54:26【问题描述】:可能重复:Howtoprofilemycode?什么是分析和性... 查看详情

当数据依赖于日期时间时,在数据库中保存日期时间和时区信息的最佳实践

】当数据依赖于日期时间时,在数据库中保存日期时间和时区信息的最佳实践【英文标题】:Bestpracticeswithsavingdatetime&timezoneinfoindatabasewhendataisdependantondatetime【发布时间】:2017-12-1110:38:07【问题描述】:关于在DB中保存日期时... 查看详情

深入理解java虚拟机(jvm高级特性与最佳实践)读后感(代码片段)

...08;第3版)前言一、自己编译JDK1.1实验系统环境1.2获取源码1.3构建编译环境1.4安装"BootStrapJDK"1.5进行编译1.5.1编译前准备1.5.2了解OpenJDK编译参数1.5.3正式编译1.5.3.1依赖项检查、参数配置和构建输出目录结构等1.5.3.2执行整... 查看详情

jdk源码之reentrantlock源码分析(代码片段)

ReentrantLock类似于synchronized是一种独占式锁(悲观锁),是基于AQS实现的轻量级锁,相比于synchronized优点在于:可自由选择锁的获取方式:公平锁和非公平锁支持可重入锁,即一个线程可以多次获取锁支持设置获... 查看详情

c++智能指针最佳实践&源码分析(代码片段)

...能指针可以解决的问题,用法及最佳实践。并且根据源码分析智能指针的实现原理。一、为什么需要使用智能指针1.1内存泄漏C++在堆上申请内存后,需要手动对内存进行释放。代码的初创者可能会注意内存的释放&#x... 查看详情

jdk8函数式编程最佳实践(代码片段)

文章导航JDK8函数式编程最佳实践1.Lambda表达式的重要接口1.1新增的函数接口1.1无参数,无返回值类型接口1.2无参数,有返回值类型接口1.3有参数,也有返回值的类型接口2.方法引用2.1静态方法引用2.2实例方法引用2.3构... 查看详情

guavacache原理分析与最佳实践(代码片段)

在大部分互联网架构中Cache已经成为了必可不少的一环。常用的方案有大家熟知的NoSQL数据库(Redis、Memcached),也有大量的进程内缓存比如EhCache、GuavaCache、Caffeine等。本系列文章会选取本地缓存和分布式缓存(NoS... 查看详情

应用统计|移动端数据统计和分析最佳实践(代码片段)

...已成为过去时。大环境的改变,也导致移动端的数据统计分析在产品的研发、决策、运营等方面起着越来越重要的作用,“精细化运营”一时间成为热点词——从大厂到创业团队,无论是自建数据统计系统还是借助于第三方,市... 查看详情

docker容器安全的8大风险和33个最佳实践丨idcf

作者:StackRox译者:冬哥原文:https://www.stackrox.io/blog/docker-security-101/容器以及例如Kubernetes等编排器开启了应用程序开发方法的新时代,支持微服务架构以及持续开发和交付。根据我们最新的容器状态和Kubernetes安... 查看详情

threadlocal源码分析(代码片段)

1、个人总结和想法:(1)、ThreadLocal的内存泄漏问题?ThreadLocal我们应该关注它的内存泄漏问题,原因虽然JDK开发者已经使用了弱引用的键来尝试解决这个问题,不过是依然存在很大风险的,因为当使用static的ThreadLocal时会使其... 查看详情

jvm源码分析之警惕存在内存泄漏风险的finalreference(增强版)

概述JAVA对象引用体系除了强引用之外,出于对性能、可扩展性等方面考虑还特地实现了四种其他引用:SoftReference、WeakReference、PhantomReference、FinalReference,本文主要想讲的是FinalReference,因为我们在使用内存分析工具比如mat等在... 查看详情

netty学习(源码分析)(代码片段)

源代码目录JavaIO到NettyNIO基础NIO的特点NIO怎么实现的同步非阻塞JavaBIO与NIO比较BIO(传统IO)伪异步IO模式NIO(Non-blocking/NewI/O)BIO和NIO对比AIO模式文件AIO网络通信AIOBIO、NIO和AIO区别零拷贝传统IO的问题NIO的优化sendFilel... 查看详情

C# 继承最佳实践

...内容的方法。我的问题是,虽然这很好用,但在运行代码分析时,我被警 查看详情

jdk源码分析arraylist的size()==0和isempty()

先看结果 分析源码【jdk源码解析】jdk8的ArrayList初始化长度为0java的基本数据类型默认值无参构造size()方法isEmpty()方法  查看详情