ZoneDateTime.getTimeZone() 不是我设置的



我想返回当前服务器时间,包括时区设置。目前我是这样做的。

  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));

相关内容

  • 没有找到相关文章

最新更新