JVM和时区

时间:2011-08-15 14:24:55

标签: java timezone

我遇到了java时区的问题,如果有人可以帮助我的话。

我有一个在tomcat 5.5上运行的Web应用程序(不确定这是否相关),具有以下JVM版本

[someuser@webserver bin]$ java -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Server VM (build 1.5.0_06-b05, mixed mode)
[someuser@webserver bin]$

系统日期是 -

[someuser@webserver bin]$ date
Mon Aug 15 09:09:46 EST 2011

在网络应用程序中,我会在Calendar.getInstance().getTime()的某个位置拨打电话,然后在日志中打印此时间戳。

问题是此时间戳在EDT中返回,尽管服务器的时间在EST中。因此,返回的日期比它应该晚1小时。

我想要实现的是让Calendar.getInstance().getTime()在与系统相同的时区中返回日期。

我搜索过论坛,并发现一些建议,即jvm无法正确读取系统的时区。 我尝试使用-Duser.timezone=EST参数启动tomcat,但系统会在EDT时区中保留返回时间戳。请注意 - 使用非est参数尝试-Duser.timezone似乎有效。 问题似乎有所不同。

我的问题与this SO question有点类似。但是,我只是试图在系统所在的时区中获取日期,而没有任何特殊处理。

你能帮忙吗?

7 个答案:

答案 0 :(得分:7)

我有同样的问题。事实证明,Java正在查找/etc/sysconfig/clock文件,而不是/etc/localtime文件。这是对more info

的评论

答案 1 :(得分:5)

EST和EDT是非常具体的,其中一个将总是“错误”,取决于一年中的时间。尝试一下“America / New_York”的时区,简单地说“纽约时间到了”。

E.g。

    DateFormat formatterET = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zzz");
    formatterET.setTimeZone(TimeZone.getTimeZone("America/New_York"));

    String timestamp = formatterET.format(new Date());

有用的时区列表:

https://calendar.york.ac.uk/en/chcncpt.html#wp1056628

答案 2 :(得分:3)

这很简单,在app main方法(或servlet上下文)中添加:

TimeZone.setDefault( TimeZone.getTimeZone("GMT-4") );

这会设置系统中所有日期的时区。

答案 3 :(得分:2)

我不确定这在Java中是否真的可行,但如果是这样的话,那肯定不是其他人所说的事情。有关Oracle的相关说明,请参阅here,特别是:

  

Java SE平台的时区数据不会从本地或主机操作系统(OS)读取,因此操作系统时区补丁不会更新JRE软件的时区数据。

答案 4 :(得分:2)

我在ubuntu服务器上遇到了同样的问题,找不到/ etc / sysconfig / clock文件。

我解决了它使用timedatectl来设置时区。

sudo timedatectl set-timezone America/New_York

答案 5 :(得分:1)

EDT& EST - 它是相同的地理区域。但EST是一个标准时间,它只适用于冬季(有些地方甚至夏季),而EDT则是夏令时的对应物。 你的问题可能与夏令时运动有关,所以我会深入研究这个方向。 您还可以通过设置默认时区来指定特定时区(通常采用国家/城市格式),但在这种情况下,您应确保不会与服务器当前时区和您指定为默认时区的任何冲突。 / p>

答案 6 :(得分:1)

在Linux上,这有点令人讨厌,因为很长一段时间Java(至少是Oracle / Sun Java)使用了一个错误的方法(好吧,我认为它在启动时没那么错,但事情已经发生了变化。)

我最好的建议是设置TZ环境变量,因为这是它要寻找的第一件事;其他的whereit会看起来(例如/ etc / sysconfig / clock,/ etc / localtime)有问题。我在http://distracted-it.blogspot.co.nz/2014/09/dont-let-java-on-linux-determine-its.html上有一篇关于它的更详细的帖子,其中包括一些背景参考和验证步骤。

-Duser.timezone=Pacific/Auckland也可以使用,但是当我尝试它时,却没有。

如果设置TZ,则应确保将其设置在适当的位置。例如,在WebLogic中间件容器中,您应该在setDomainEnv.sh中设置它,因为WebLogic将首先清理环境并且不会看到TZ(我的帖子显示了如何验证JVM进程是否正在查看它。)< / p>