有个ticket是关于time zone的,在本地测总是ok的,但是在国外客户那边总是fail,原来就是在获取time zone的方法中,在不同的环境中,取得time zone是不一样的。
比如这个time zone是中国的,
TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
Calendar cal = CalendarFactoryUtil.getCalendar(timeZone);
cal .set(Calendar.MONTH, 5);
cal .set(Calendar.DATE, 12);
cal .set(Calendar.YEAR, 2013);
cal .set(Calendar.HOUR_OF_DAY, 10);
cal .set(Calendar.MINUTE, 0);
这个当前时间 cal 的timezone就是中国的。 GMT +8
但是 cal.getTime() 确不一定是取得是中国timezone的时间, 这得根据这段code运行的web 容器的jvm timezone来决定的。
比如jvm的timezone是"Europe Paris" GMT+1,
cal.getTime()的值就是2013-5-12 3:00:00 (10 - 7)
jvm设置的timezone. 在bin目录下setenv.bat文件中,-Duser.timezone=, 如果不设,就默认是当前jvm机器系统的timezone。
TimeZoneUtil.getDefault() 取得portal timezone。
CalendarFactoryUtil.getCalendar().getTimeZone 取得的是jvm的timezone。
TimeZone.getDefault() 取得是 当前jvm的timezone,如果jvm没有设置,就是操作系统的time zone。
关键点就是你要知道这个获得timezone 是来自哪里。
那如何从源码知道方法是从什么地方获取time zone的呢? 且听下回分解。
源码分析1:
TimeZoneUtil.getDefault() --> private TimeZone getDefault() { TimeZone timeZone = TimeZoneThreadLocal.getDefaultTimeZone(); if (timeZone != null) { return timeZone; } return _timeZone; // TimeZone.getTimeZone("UTC"); } --> 在Tomcat启动阶段初始化Company时: LocaleThreadLocal.setDefaultLocale(company.getLocale()); // 可以看出,设置的是portal级别的time zone,所以TimeZoneUtil.getDefault取portal time zone. TimeZoneThreadLocal.setDefaultTimeZone(company.getTimeZone());
在TimeZoneThreadLocal类中,用ThreadLocal来存放default time zone. 是因为在初始化多个Company时,
会有线程安全问题。
String[] webIds = PortalInstances.getWebIds(); for (String webId : webIds) { PortalInstances.initCompany(servletContext, webId); }
源码分析2:
为什么TimeZone.getDefault()获取的是jvm的timezone。
String zoneID = AccessController.doPrivileged(new GetPropertyAction("user.timezone"));
可以看到是从jvm的启动参数user.timezone 来获取的。
if (zoneID == null || zoneID.equals("")) { //如果,jvm中没有设置timezone参数 String country = AccessController.doPrivileged( new GetPropertyAction("user.country")); String javaHome = AccessController.doPrivileged( new GetPropertyAction("java.home")); try { zoneID = getSystemTimeZoneID(javaHome, country);//它就会取操作系统的timezone if (zoneID == null) { zoneID = GMT_ID; // 如果还是获取不到,就默认是GMT timezone } } catch (NullPointerException e) { zoneID = GMT_ID; } }
相关推荐
IANA Time Zone Database (简称tzdata) 时区数据
世界范围内的时区列表。由 java.util.TimeZone 类导出
如何修改时区(TIMEZONE)如何修改时区(TIMEZONE)如何修改时区(TIMEZONE)如何修改时区(TIMEZONE)
php报时区错误,按照网上说的改时间date.timezone... You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still
前端项目-timezone-js,JavaScript timezone library based on Olson timezone data
api-ms-win-core-timezone-l1-1-0.dll
TimeZone例子TimeZone例子TimeZone例子TimeZone例子
最新Google日历的时区选择列表Time zone,2021年9月2日
今天说一下时钟和日历里的Home time zone显示不一致的问题,大家一起学习下。
Delphi 无控件实现TimeZone世界时间对照程序 Delphi无控件实现TimeZone世界时间对照程序,选中一个时间,可显示世界主要城市对照时间,方便倒时差。
IDEA连接mysql报时区serverTimezone错误 解决方案
前端项目-moment-timezone,分析并显示任何时区中的时刻。
Arduino-Timezone.zip,Arduino图书馆,方便时区转换和自动夏令时(夏季)调整。Arduino时区图书馆,Arduino是一家开源软硬件公司和制造商社区。Arduino始于21世纪初,深受电子制造商的欢迎,Arduino通过开源系统提供...
NULL 博文链接:https://bchen.iteye.com/blog/1632845
mysql关于时区的插件,解决django集成celery时的报错
TimeZoneNames, 使用CLDR和TZDB源提供本地化时区名称 TimeZoneNames 使用CLDR和TZDB源提供本地化时区名称的简单库。为什么因为. NET's 通常的时区显示名称没有正确地本地化,并且不适合各种方案。 阅读这里博客文章...
PostgreSQL的学习心得和知识总结(四十五)|关于PostgreSQL数据库开源作业调度扩展 pg_cron 默认GMT时区修改 的实现方案
要求经过测试: Ubuntu 16.04 LTS Ubuntu 18.04 LTS Ubuntu 20.04 LTS 应该与: 所有Ubuntu 所有Debian角色变量 ag_timezone : A timezone (e.g Etc/UTC)依存关系没有任何。剧本范例 - hosts : servers roles : - { ...
可以查看不同地区timezone的工具,非常方便易用
timezone,linux下安装kettle时所需的依赖包,解决libwebkitgtk报错问题