`

Time zone

 
阅读更多

有个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) 时区数据

    在编程中,我们通常会使用库或API来访问tzdata,比如Python的pytz库,JavaScript的moment-timezone库等,它们提供了便捷的方式来解析和操作时区数据,实现时间的转换和展示。 总之,IANA Time Zone Database是理解...

    java.util.TimeZone 的世界时区列表

    ### Java.util.TimeZone的世界时区列表解析 #### 一、概述 `java.util.TimeZone` 是Java标准库中的一个类,用于表示不同时区的信息。本文档提供了通过`java.util.TimeZone`类导出的世界范围内时区列表。该列表不仅...

    timezone_2021a_posix_sql

    【标题】"timezone_2021a_posix_sql"是一个与MySQL数据库系统相关的插件,主要用于处理时间区域设置。这个插件旨在解决在集成Django框架与Celery任务队列时可能出现的时间区域相关的问题。在分布式系统中,正确处理...

    Oracle Timestamp with Time zone & java

    Oracle的Timestamp with Time Zone类型与Java的交互是数据库编程中一个重要的知识点,特别是在处理跨越时区的数据时。本文将深入探讨这两个概念以及它们在实际应用中的互动。 Oracle的Timestamp with Time Zone类型...

    世界时间对照TimeZone

    "世界时间对照TimeZone"这个主题涉及到的是如何处理和显示不同地理位置的时间。这通常与编程语言中的“时区”概念紧密相关,时区是根据地球上的经度划分的区域,每个区域都有自己的本地时间。在计算机系统中,我们...

    前端项目-moment-timezone.zip

    "前端项目-moment-timezone.zip" 是一个专门针对时区处理的前端项目,它基于著名的JavaScript库Moment.js,并扩展了对时区支持的功能。这个项目旨在帮助开发者更准确、方便地分析和展示全球各地的时刻。 首先,我们...

    如何修改时区(TIMEZONE)

    如何修改时区(TIMEZONE)如何修改时区(TIMEZONE)如何修改时区(TIMEZONE)如何修改时区(TIMEZONE)

    前端项目-timezone-js.zip

    **前端项目-timezone-js** 是一个基于Olson时区数据的JavaScript库,专门用于处理和显示全球不同时区的时间。这个库为Web开发者提供了一种简单有效的方式来处理时区转换和时间显示,尤其是在构建需要跨时区交互的Web...

    php报时区错误,按照网上说的改时间date.timezone根本不管用!怎么解决,看我的.zip

    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世界时间对照程序

    在本文中,我们将深入探讨如何使用Delphi编程语言无控件地实现一个TimeZone世界时间对照程序。这个程序的目的是在不依赖任何特定图形用户界面组件的情况下,帮助用户查看选定时间在全球主要城市的时间对应情况,这...

    TimeZone_demo_时区例子

    `TimeZone_demo_时区例子`是一个ASP.NET项目,旨在演示如何在应用程序中实现时区选择功能,帮助用户根据自己的地理位置选择相应的时区,并获取该时区的相关信息。这个项目主要涉及到以下几个知识点: 1. **时区概念...

    api-ms-win-core-timezone-l1-1-0.dll

    api-ms-win-core-timezone-l1-1-0.dll

    TimeZone例子

    TimeZone例子TimeZone例子TimeZone例子TimeZone例子

    最新Google日历的时区选项 Time zone selector(中文+英文).txt

    最新Google日历的时区选择列表Time zone,2021年9月2日

    时钟和日历里的Home time zone显示不一致

    今天说一下时钟和日历里的Home time zone显示不一致的问题,大家一起学习下。

    IDEA连接mysql报时区serverTimezone错误

    IDEA连接mysql报时区serverTimezone错误 解决方案

    Arduino-Timezone.zip

    Arduino-Timezone.zip,Arduino图书馆,方便时区转换和自动夏令时(夏季)调整。Arduino时区图书馆,Arduino是一家开源软硬件公司和制造商社区。Arduino始于21世纪初,深受电子制造商的欢迎,Arduino通过开源系统提供...

    TimeZoneNames, 使用CLDR和TZDB源提供本地化时区名称.zip

    TimeZoneNames, 使用CLDR和TZDB源提供本地化时区名称 TimeZoneNames 使用CLDR和TZDB源提供本地化时区名称的简单库。为什么因为. NET's 通常的时区显示名称没有正确地本地化,并且不适合各种方案。 阅读这里博客文章...

    Laravel开发-timezone

    在Laravel框架中,`timezone`是一个非常关键的设置,它影响着整个应用程序中的日期和时间处理。`timezone`配置允许开发者指定应用默认时区,确保时间显示与用户所在的地理位置相匹配,提供更好的用户体验。本篇文章...

    wox插件timezone

    标题:“wox插件timezone”是一个针对Wox启动器的实用工具,它专门设计用于查询全球各地的时区信息。Wox是一款高效快速的启动器,它允许用户通过简单的输入来查找并启动应用程序、打开文件或进行网络搜索等操作。而...

Global site tag (gtag.js) - Google Analytics