有个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; } }
相关推荐
在编程中,我们通常会使用库或API来访问tzdata,比如Python的pytz库,JavaScript的moment-timezone库等,它们提供了便捷的方式来解析和操作时区数据,实现时间的转换和展示。 总之,IANA Time Zone Database是理解...
### Java.util.TimeZone的世界时区列表解析 #### 一、概述 `java.util.TimeZone` 是Java标准库中的一个类,用于表示不同时区的信息。本文档提供了通过`java.util.TimeZone`类导出的世界范围内时区列表。该列表不仅...
【标题】"timezone_2021a_posix_sql"是一个与MySQL数据库系统相关的插件,主要用于处理时间区域设置。这个插件旨在解决在集成Django框架与Celery任务队列时可能出现的时间区域相关的问题。在分布式系统中,正确处理...
Oracle的Timestamp with Time Zone类型与Java的交互是数据库编程中一个重要的知识点,特别是在处理跨越时区的数据时。本文将深入探讨这两个概念以及它们在实际应用中的互动。 Oracle的Timestamp with Time Zone类型...
"世界时间对照TimeZone"这个主题涉及到的是如何处理和显示不同地理位置的时间。这通常与编程语言中的“时区”概念紧密相关,时区是根据地球上的经度划分的区域,每个区域都有自己的本地时间。在计算机系统中,我们...
"前端项目-moment-timezone.zip" 是一个专门针对时区处理的前端项目,它基于著名的JavaScript库Moment.js,并扩展了对时区支持的功能。这个项目旨在帮助开发者更准确、方便地分析和展示全球各地的时刻。 首先,我们...
如何修改时区(TIMEZONE)如何修改时区(TIMEZONE)如何修改时区(TIMEZONE)如何修改时区(TIMEZONE)
**前端项目-timezone-js** 是一个基于Olson时区数据的JavaScript库,专门用于处理和显示全球不同时区的时间。这个库为Web开发者提供了一种简单有效的方式来处理时区转换和时间显示,尤其是在构建需要跨时区交互的Web...
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
在本文中,我们将深入探讨如何使用Delphi编程语言无控件地实现一个TimeZone世界时间对照程序。这个程序的目的是在不依赖任何特定图形用户界面组件的情况下,帮助用户查看选定时间在全球主要城市的时间对应情况,这...
`TimeZone_demo_时区例子`是一个ASP.NET项目,旨在演示如何在应用程序中实现时区选择功能,帮助用户根据自己的地理位置选择相应的时区,并获取该时区的相关信息。这个项目主要涉及到以下几个知识点: 1. **时区概念...
api-ms-win-core-timezone-l1-1-0.dll
TimeZone例子TimeZone例子TimeZone例子TimeZone例子
最新Google日历的时区选择列表Time zone,2021年9月2日
今天说一下时钟和日历里的Home time zone显示不一致的问题,大家一起学习下。
IDEA连接mysql报时区serverTimezone错误 解决方案
Arduino-Timezone.zip,Arduino图书馆,方便时区转换和自动夏令时(夏季)调整。Arduino时区图书馆,Arduino是一家开源软硬件公司和制造商社区。Arduino始于21世纪初,深受电子制造商的欢迎,Arduino通过开源系统提供...
TimeZoneNames, 使用CLDR和TZDB源提供本地化时区名称 TimeZoneNames 使用CLDR和TZDB源提供本地化时区名称的简单库。为什么因为. NET's 通常的时区显示名称没有正确地本地化,并且不适合各种方案。 阅读这里博客文章...
在Laravel框架中,`timezone`是一个非常关键的设置,它影响着整个应用程序中的日期和时间处理。`timezone`配置允许开发者指定应用默认时区,确保时间显示与用户所在的地理位置相匹配,提供更好的用户体验。本篇文章...
标题:“wox插件timezone”是一个针对Wox启动器的实用工具,它专门设计用于查询全球各地的时区信息。Wox是一款高效快速的启动器,它允许用户通过简单的输入来查找并启动应用程序、打开文件或进行网络搜索等操作。而...