对于时间分为 本地挂钟时间 和 UTC时间,所谓的UTC时间就是指表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数 ,毫无疑问这个时间所有计算机都是一样的。那么我们任务栏上的时间是怎么回事呢?那是OS会把计算机所在的当前时区加上,如:中国在东八区,就会在UTC时间上加上 8(小时)*60*60*1000作为本地挂钟时间(不考虑夏令时)。
这篇文章主要是说明,为什么修改了“系统时区”,程序不能马上把打印时间切换到修改的时区,而是需要重新再次执行该程序的时候,才能生效(http://www.iteye.com/post/338220)。
JDK源代码中
java 代码
- private static void setDefaultZone() {
- TimeZone tz = null;
-
- String zoneID = (String) AccessController.doPrivileged(
- new GetPropertyAction("user.timezone"));
-
-
-
- if (zoneID == null || zoneID.equals("")) {
- String country = (String) AccessController.doPrivileged(
- new GetPropertyAction("user.country"));
- String javaHome = (String) AccessController.doPrivileged(
- new GetPropertyAction("java.home"));
- try {
- zoneID = getSystemTimeZoneID(javaHome, country);
- if (zoneID == null) {
- zoneID = GMT_ID;
- }
- } catch (NullPointerException e) {
- zoneID = GMT_ID;
- }
- }
-
-
-
- tz = getTimeZone(zoneID, false);
-
- if (tz == null) {
-
-
-
- String gmtOffsetID = getSystemGMTOffsetID();
- if (gmtOffsetID != null) {
- zoneID = gmtOffsetID;
- }
- tz = getTimeZone(zoneID, true);
- }
- assert tz != null;
-
- final String id = zoneID;
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- System.setProperty("user.timezone", id);
- return null;
- }
- });
-
- defaultZoneTL.set(tz);
- }
显然这段代码的意思是:如果在系统变量中找不到设置的TimeZone就会设置新的,如果找到了就使用原来存在的,那为什么重新执行该程序就可以了呢?
因为这里的系统指的是JRE而不是我们的OS,当执行一个程序的时候后,JVM会创建一个JVM实例,这个实例的生命周期就是这个进程的生命的周期,我们写入的系统变量都是些入了这个JVM实例,当然再次执行这个程序,又会创建一个新的JVM实例,原来写入的系统变量也就不存在了。
这里介绍一下
java 代码
- String zoneID = (String) AccessController.doPrivileged(
- new GetPropertyAction("user.timezone"));
这是一个特权处理(摘自
http://ganzhi.bokee.com/1791837.html):
来自不同的位置的代码可以由一个CodeSource对象描述其位置和签名证书。根据代码的CodeSource的不同,代码拥有不同的权限。例如所有Java SDK自带的代码都具有所有的权限,而Applet中的代码则具有非常受限的权限,用户编写的代码可以自己定制权限(通过SecurityManager)。
当执行一段代码时,这段代码的StackTrace包含了从Main开始所有正在被调用而且没有结束的方法。在这个调用过程中,很有可能出现跨多个不同的CodeSource的调用序列。由于CodeSource不同,这些代码通常拥有不同的权限集。只有所有途经的CodeSource都具有对应的权限集合时,当前正在运行的代码才能存取某个Resource。
而doPrivileged方法是对这个规则的一种补充。他类似于Unix中的setuid程序。Unix中的login程序必须访问password文件从而获得用户授权信息,但是用户不能随意的访问password文件。因此,login程序具有setuid位,它不管被哪个用户所调用,都具有root的权限。
调用doPrivileged的方法不管其StackTrace中其他方法的权限,而仅仅根据当前方法的权限来判断用户是否能访问某个resource。也即可以规定用户只能用某种预定的方式来访问其本来不能访问的resource。
使用doPrivileged方法和使用setuid位都有需要注意的地方,例如仅执行必要的操作。否则,可能带来安全上的问题。
对于
java 代码
- new GetPropertyAction("user.timezone")
就是“利用需要取到值的系统变量名称创建GetPropertyAction对象”,该对象的作用可以在特权处理中重新得到系统变量名称代表的变量值。
这段代码是jdk1.4和1.5中的公共部分,在1.5中 增加了ThreadLocal保证不同线程逗留保留一份该时区系统属性的副本,保证同一个进程中的不同线程使用到TimeZone.getDefault()可以从ThreaLocal中直接取出!
分享到:
- 2007-08-11 11:33
- 浏览 3290
- 评论(0)
- 论坛回复 / 浏览 (0 / 9424)
- 查看更多
相关推荐
`java.util.TimeZone` 是Java标准库中的一个类,用于表示不同时区的信息。本文档提供了通过`java.util.TimeZone`类导出的世界范围内时区列表。该列表不仅包括了各大洲的主要城市和地区,还涵盖了特殊地区与时区调整...
Oracle的Timestamp with Time Zone类型与Java的交互是数据库编程中一个重要的知识点,特别是在处理跨越时区的数据时。本文将深入探讨这两个概念以及它们在实际应用中的互动。 Oracle的Timestamp with Time Zone类型...
在Java编程中,`TimeZone` 类是处理时区的关键组件,它允许我们获取和设置与特定地理位置相关的日期和时间偏移。时区不仅反映了地理位置相对于格林尼治标准时间(GMT)的偏移,还考虑了夏令时(DST)的调整。本文将...
例如,Java中的`java.util.TimeZone`类,提供了获取、设置和转换时区的方法。 在Windows系统中,系统资源库包含了全球各种时区的信息,开发者可以通过系统API来访问这些信息。而在Linux或Unix系统中,`zoneinfo`...
Java对世界不同时区timezone之间时间转换的处理方法需要了解时区的概念、时区之间的时间转换方法、Java中关于时间处理的类。使用Java实现时区之间时间转换可以使用TimeZone类和DateFormat类等。
Java中的`TimeZone`类是处理时区信息的关键组件。它代表了地球上特定地理位置的日出、日落和其他时间标准。在编程中,特别是在处理日期和时间跨不同地域的应用中,理解和正确使用`TimeZone`是非常重要的。以下是一些...
今天遇到了一个比较有意思的问题,从服务器上封装好的java.sql.timestamp对象返回到本地客户端程序后与数据库中的时间相差了整整14个小时。因为跟客户的时差是14个小时,所以大体怀疑是时差问题。
总之,当遇到Java 8插入MySQL时间数据时出现8小时偏差的问题,检查并调整JDBC连接字符串中的`serverTimezone`参数至关重要。正确设置时区参数,如`Asia/Shanghai`,能确保时间和日期的准确无误地存储和检索。这是一...
"timezone-boundary-builder"是一个用于构建时区边界数据的开源工具,它帮助我们生成适用于Java `TimeZone` 类的数据。本文将深度剖析其源码,揭示其内部工作机制,帮助开发者更好地理解和使用这个工具。 1. **项目...
2. **修改Java连接URL**:在IDEA中,你需要修改数据库连接的URL,添加`serverTimezone`参数。例如,如果你的数据库服务器位于上海,你可以将URL改为`jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=...
java -Duser.timezone=Asia/Shanghai YourMainClass ``` 这将确保JVM使用上海时区,从而使得`new Date()` 输出正确的时间。 2. **在代码中显式设置时区**: 如果你无法或不想通过命令行参数改变JVM时区,你也...
如果你不能或不想通过命令行参数设置时区,可以在代码中使用`TimeZone`类进行设置: ```java TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); ``` 3. **使用`java.time`包**: 如果你的项目使用...
Java通过`java.util.TimeZone`类来管理全球不同的时区信息。时区是地球上的地理位置,它决定了本地时间与协调世界时间(UTC)之间的差异。Java中的时区数据主要来自于TZ数据库,也称为IANA时区数据库。 在Java程序...
Java中的时区处理涉及到几个关键类:Date, Calendar, TimeZone, 和 SimpleDateFormat。这些类在处理时间日期时扮演着不同的角色。 1. **Date类**:Date对象代表的是一个时间点,精确到毫秒。它不包含任何时区信息,...
首先,我们需要了解Java中的`TimeZone`类,它是Java日期和时间API的核心部分。`TimeZone`类代表了一个特定的时区,它包含了时区的ID(如"Asia/Shanghai")和相对于协调世界时间(UTC)的偏移量。Java使用`TimeZone....
`java.timezone=GMT+8` 添加了这些设置后,Java 应用程序将使用 GMT+8 时区,这将解决 8 小时时差问题。 在某些情况下,可能需要手动设置 Java 的时区设置。在这种情况下,可以通过修改 Java 的配置文件或使用 ...
- Java中的时区处理通过`java.util.TimeZone`类进行。错误的时区设置可能导致时间获取不正确。 - 时区ID是标识特定地理位置的字符串,如"Asia/Shanghai",确保使用正确时区ID是关键。 - 使用`TimeZone.getDefault...
Java的 `TimeZone` 类考虑了这种情况,但需要确保时区设置包含了正确的夏令时规则。 3. **代码逻辑错误**:如果在代码中对时间进行了错误的操作,比如加减小时、分钟等,也可能导致时间不准确。确保在进行时间计算...
`TimeZone.getDefault()`获取默认时区,`TimeZone.getTimeZone("Asia/Shanghai")`获取上海时区。 - Java 8的`ZonedDateTime`类提供了时区支持,例如`ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("America/New...
TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai"); calendar.setTimeZone(timeZone); ``` 接下来,我们可能需要显示日期。Java提供了`SimpleDateFormat`类来进行日期格式化,如将日期转换为“年-月-日”...