我想返回当前服务器时间,包括时区设置。目前我是这样做的。
private void handleGetTimeDate(User_Itf user, HttpServletRequest request, HttpServletResponse response) throws IOException, ServiceException {
JSONObject time = new JSONObject();
time.put("hour", ZonedDateTime.now().getHour());
time.put("minute", ZonedDateTime.now().getMinute());
time.put("second", ZonedDateTime.now().getSecond());
time.put("year", ZonedDateTime.now().getYear());
time.put("month", ZonedDateTime.now().getMonthValue());
time.put("day", ZonedDateTime.now().getDayOfMonth());
time.put("zone", Calendar.getInstance().getTimeZone().getID());
response.getWriter().print(time);
response.setStatus(HttpServletResponse.SC_OK);
}
在另一种方法中,我使用timedatectl -setTimezone
成功地设置了服务器时区。我甚至开始在设置时区的同时执行Calendar.getInstance().setTimeZone(TimeZone.getTimeZone(dateString));
,希望它能更新日历。在我更改时区后,handleGetTimeDate方法仍然返回旧的TimeZone和时间,现在偏移量错误。有时,该方法会突然返回实际设置的时区,但我还无法弄清楚其行为。有没有人对我如何解决这个问题有一些想法,并且总是得到实际设定的时区?
更新
这是来自终端的结果:
root@dev-ru1:~# timedatectl
Local time: Wed 2017-06-07 21:26:55 ART
Universal time: Thu 2017-06-08 00:26:55 UTC
RTC time: Thu 2017-06-08 00:26:51
Time zone: America/Argentina/Tucuman (ART, -0300)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
这就是为什么我从我的Java方法中得到:
{"hour":21,"month":6,"year":2017,"zone":"America/Belem","day":7,"minute":30,"second":35}
您应该避免多次调用ZonedDateTime.now()
(出于性能考虑,但更重要的是出于一致性原因:假设您在午夜前运行该方法,时间显示为23,但当您阅读当天的内容时,已经过了午夜)。
此外,不需要将java时间API与遗留的Calendar类混合使用。
private void handleGetTimeDate(User_Itf user, HttpServletRequest request, HttpServletResponse response) throws IOException, ServiceException {
JSONObject time = new JSONObject();
ZonedDateTime now = ZonedDateTime.now();
time.put("hour", now.getHour());
time.put("minute", now.getMinute());
time.put("second", now.getSecond());
time.put("year", now.getYear());
time.put("month", now.getMonthValue());
time.put("day", now.getDayOfMonth());
time.put("zone", now.getZone());
response.getWriter().print(time);
response.setStatus(HttpServletResponse.SC_OK);
}
注意,ZonedDateTime.now()
使用系统时区,如果您更新它,它应该会更改:
如果系统默认时区发生更改,则此方法的结果也将发生更改。
Tomcat服务器(版本8.0.x)显然捕获了TimeZone设置。这意味着Tomcat本身只会在重新启动时更新设置。
如果您想在不重新启动的情况下更改时区,则需要在tomcat环境中手动设置新时区。
这可以通过以下方式完成:TimeZone.setDefault(TimeZone.getTimeZone(dateString));