Java TimeZone 和 Linux TimeZone问题
1人收藏此文章, 我要收藏 发表于1年前 , 已有1777次阅读 共0个评论
昨天发现跑在Linux上的java程序获取的默认时区有问题。
由于我所用Linux的时区由/etc/localtime所指的文件(如果环境变量TZ不存在时):
[xx:~]> ls -l /etc/localtime
lrwxrwxrwx 1 root root 18 Jun 21 2008 /etc/localtime -> /var/etc/localtime
[xx:~]> ls -l /var/etc/localtime
lrwxrwxrwx 1 root root 30 May 14 09:46 /var/etc/localtime -> /usr/share/zoneinfo/US/Eastern
开始时,我以为应该是和/etc/localtime指向的时区一样的,接着才发现原来java在没有TZ环境变量时取的是 /etc/sysconfig/clock
中的时时区。 Sun上面有和我这种情况相关的bug - Default timezone is incorrectly set occasionally on Linux(http://bugs.sun.com/view_bug.do?bug_id=6456628), 里面描述了java vm取的默认timezone的算法:
1)如有环境变量 TZ设置,则用TZ中设置的时区
2)在 /etc/sysconfig/clock文件中找 "ZONE"的值
3)如何2)都没,就用/etc/localtime 和 /usr/share/zoneinfo 下的时区文件进行匹配,如找到匹配的,就返回对应的路径和文件名。
下面是我的测试:
java测试程序(来自:http://www.minaret.biz/tips/timezone.html)
import java.util.Date;
import java.util.TimeZone;
public class TimeTest {
public static void main(String args[]) {
long time = System.currentTimeMillis();
String millis = Long.toString(time);
Date date = new Date(time);
System.out.println("Current time in milliseconds = " + millis + " => " + date.toString());
System.out.println("Current time zone: " + TimeZone.getDefault().getID());
}
}
查看本地时区设置:
[xx:~]> echo $TZ
(TZ 环境变量没设置)
[xx:~]> ls -l /var/etc/localtime
lrwxrwxrwx 1 root root 30 May 14 02:24 /var/etc/localtime -> /usr/share/zoneinfo/US/Arizona
[xx:~]>date
Fri May 14 02:30:05 MST 2010
date 命令显示的时间 和 /var/etc/localtime 指向的时间一致
查看/etc/sysconfig/clock中的时区设置(Redhat Linux)
[xx:~]> cat /etc/sysconfig/clock
ZONE="America/New_York"
UTC=false
ARC=false
[xx:~]> java TimeTest
Current time in milliseconds = 1273829564349 => Fri May 14 05:32:44 EDT 2010
Current time zone: America/New_York
Current time zone display: Eastern Standard Time
[xx:~]>
TimeTest运行结果显示,java vm取得的的默认时区和 /etc/sysconfig/clock 中的设置一样。让我们来验证一下:
1)修改/etc/sysconfig/clock:
[xx:~]> vim /etc/sysconfig/clock
ZONE="US/Central"
UTC=false
ARC=false
2)再运行 TimeTest
[xx:~]> java TimeTest
Current time in milliseconds = 1273829718269 => Fri May 14 04:35:18 CDT 2010
Current time zone: US/Central
Current time zone display: Central Standard Time
修改/var/etc/localtime 指向时区
先看看date显示:
[xx:~]> date
Fri May 14 02:36:37 MST 2010
[xx:~]> sudo ln -sf /usr/share/zoneinfo/US/Central /var/etc/localtime
查看date命令结果的变化
[xx:~]> date
Fri May 14 04:37:41 CDT 2010
可以到时间和时区自动变了
好,再看另外一种情况:当 TZ 这个环境变量存在并有设置时
首先看看TZ的值为空时,date命令结果的变化
[xx:~]> export TZ=
[xx:~]> date
Fri May 14 09:41:04 UTC 2010
时间变了,且时区显示是UTC(Universial Time Coordination).
也看看TimeTest的运行结果:
[xx:~]> java TimeTest
Current time in milliseconds = 1273830175690 => Fri May 14 09:42:55 GMT 2010
Current time zone: GMT
Current time zone display: Greenwich Mean Time
[xx:~]>
可以看出,java vm 默认时区是GMT。
给TZ赋某个时区:
[xx:~]> export TZ="US/Central"
[xx:~]> date
Fri May 14 04:44:40 CDT 2010
date的输出跟着 TZ 变量马上调整过来
运行TimeTest
[xx:~]> java TimeTest
Current time in milliseconds = 1273830328966 => Fri May 14 04:45:28 CDT 2010
Current time zone: US/Central
Current time zone display: Central Standard Time
TimeTest 取得和TZ一样的时区
[xx:~]> sudo ln -sf /usr/share/zoneinfo/US/Eastern /var/etc/localtime
[xx:~]> date
Fri May 14 04:46:16 CDT 201
[xx:~]> export TZ="US/Eastern"
[xx:~]> date
Fri May 14 05:47:58 EDT 2010
参考资料:
1.Default timezone is incorrectly set occasionally on Linux
http://bugs.sun.com/view_bug.do?bug_id=6456628
2. 如何设置Linux时间
http://www.hypexr.org/linux_date_time_help.php
3. 解决java default Timezone 问题的方法
http://www.minaret.biz/tips/timezone.html
分享到:
相关推荐
例如,Java中的`java.util.TimeZone`类,提供了获取、设置和转换时区的方法。 在Windows系统中,系统资源库包含了全球各种时区的信息,开发者可以通过系统API来访问这些信息。而在Linux或Unix系统中,`zoneinfo`...
`TimeZone` 类提供了多种时区设置方式,包括使用 GMT、UTC 等国际时区标准。 在解决 Java 获取时间与系统时间差 N 个小时的问题时,需要首先找到 Java 的时区设置文件。这个文件通常位于 `jre` 文件夹下的 `lib\zi`...
JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Duser.timezone=...
- **配置参数**:理解JDBC URL中的各种配置参数,如`useSSL`、`serverTimezone`等,以便根据需求进行调整。 总之,MySQL Connector/J 8.0.16.jar是Java开发者与MySQL数据库互动的必备工具。通过熟练掌握其使用方法...
可以使用`java.util.TimeZone`类来设置和转换时区,以确保日期和时间的准确处理。 3. **Tomcat配置**:Tomcat服务器在启动时可能会读取系统级别的环境变量,包括时区设置。如果Tomcat的`server.xml`配置文件中没有...
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ADD target/diversion-0.0.1-SNAPSHOT.jar diversion-0.0.1-SNAPSHOT.jar ENTRYPOINT ["tini","java","-Djava.security.egd=file:...
serverTimezone=UTC <username>openfire_user <password>your_password ``` 最后,启动Openfire服务: ```bash sudo /opt/openfire/bin/startup.sh ``` 你可以在Web界面中进一步配置Openfire,通过浏览器访问`...
characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai db.user=root db.password=zhangjianshan ``` 最后,通过`startup.sh`脚本启动Nacos服务。 ...
例如,使用`apt-get update`或`yum update`来更新包列表,`timedatectl set-timezone Asia/Shanghai`来设置时区,`useradd`和`groupadd`创建新用户和组,`ufw allow`或`iptables`配置防火墙规则。 然后是**安装JDK...
He started his career with Unix/Linux and Java and then moved towards big data and NoSQL World. He has worked on various big data projects. He has recently started a technical blog called Technical ...
- 设置时区为亚洲/上海:`timedatectl set-timezone Asia/Shanghai` - **终端启动快捷键**:创建一个新的桌面快捷方式,命名为“Terminal”,并将命令设置为`/usr/bin/gnome-terminal`。 - **中文输入法设置**:...
useSSL=false&serverTimezone=UTC" username="your_mysql_username" password="your_mysql_password"/> ``` 2. 在Java应用中使用JNDI查找数据源: ```java Context initCtx = new InitialContext(); Context ...
timezone --utc Asia/Shanghai ``` #### 引导加载程序配置 1. **设置引导加载程序位置和驱动顺序:** ```bash bootloader --location=mbr --driveorder=sda --append="rhgb quiet" ``` #### 分区信息 1. **...
JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai" ``` - `-Duser.timezone=Asia/Shanghai`:设置JVM的时区为中国上海时区。 **注意事项:** - Windows环境...
这可能通过调用 Java 的 `TimeZone` 类来实现,该类提供了获取和设置时区信息的方法。标签的更新可能涉及到了 Java 的字符串处理和 GUI 更新机制。 ### 小显示怪癖 描述中提到的“小显示怪癖”是指在从时区编辑到...
useSSL=false&serverTimezone=UTC" username="root" password="yourRootPassword" maxActive="100" maxIdle="30" maxWait="10000"/> ``` 在上述配置中,`url`指定了数据库的地址和端口,`username`和`password`...
java里多线程就是一个new thread的事情,php依赖apache靠着linux底层有一个多线程的办法。 这里就来说说如果你无法操控apache的服务器,如何模拟php并发 <?php if(function_exists('date_default_timezone_set')...
5. **多时区支持**:全球时钟应用需要处理不同时区的时间,这涉及到`java.util.TimeZone`类,用于获取和设置时区信息。 6. **UI设计**:在Android中,界面布局通常由XML文件定义,如`activity_main.xml`,包含各种...
理解和使用`TimeZone`(Java)或`pytz`(Python)库处理时区,以及`java.text.SimpleDateFormat`的`z`属性进行时区转换,是国际化的关键。 10. **日期时间与数据库交互**:在数据库中存储和检索日期时间数据时,...