从1-5步依次去获取,如果第一步没有获取到就进入第二步获取依次类推。
1.getDefaultInAppContext()      -- no  TimeZone.setDefault()
2.defaultTimeZone             -- no  TimeZone.setDefault()
3.检查系统变量user.timezone     -- no  compile option
4.native方法 openJDK c代码:
/lib/tzmappings 查找TZ          -- not exist
/etc/timezone            -- not exist
/etc/localtime            -- exist
(发现问题,jdk如果发现/etc/localtime是软连接,就会读取软连接包括路径,在这个软连接中搜索字符串"zoneinfo/",如果没有就返回null,有的话取后面的字符串作为时区文件名,然后去java.home/lib/zi/目录下去找相应的data格式的文件,进而解析出时区和夏令时,华为的问题有两个,一个是之前他们的时区文件放在了/etc/CGP下,导致jdk搜索不到"zoneinfo/",结果返回null,导致java只能用GMT时间;第二个问题是即使把CGP放到zoneinfo/下,时区正常,但夏令时不正常,是因为java得到CGP文件名后去java.home/lib/zi/目录下找,结果没找到,然后就自己制作了一个GMT+08:00这个变量,付给了user.timezone,导致时区正常,但这个东西不能表示夏令时,所以导致夏令时有问题,具体可以看TimeZone.setDefaultZone()函数)
5.GMT