我遇到了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有点类似。但是,我只是试图在系统所在的时区中获取日期,而没有任何特殊处理。
你能帮忙吗?
答案 0 :(得分:7)
我有同样的问题。事实证明,Java正在查找/etc/sysconfig/clock
文件,而不是/etc/localtime
文件。这是对more info
答案 1 :(得分:5)
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());
有用的时区列表:
答案 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>