在ServletContextListener初始化方法中,我们将时区设置为
public void contextInitialized(ServletContextEvent event) {
TimeZone.setDefault(TimeZone.getTimeZone("GMT+00:00"));
}
但是,当我检查servlet和过滤时时区信息时,时区就会更改。 任何人都知道可能是什么原因。
谢谢
请参阅,我已经关注class
public class TimeZ {
public static void main(String args[]){
System.out.println("1."+TimeZone.getTimeZone("GMT+00:00"));
System.out.println("2. "+TimeZone.getDefault());
TimeZone.setDefault(TimeZone.getTimeZone("GMT+00:00"));
System.out.println("3. "+TimeZone.getDefault());
System.out.println("4. "+TimeZone.getTimeZone("GMT+00:00"));
}
}
我的输出是:
1.sun.util.calendar.ZoneInfo[id="GMT+00:00",offset=0,dstSaving...
2. sun.util.calendar.ZoneInfo[id="Asia/Calcutta",offset=19800000,...
3. sun.util.calendar.ZoneInfo[id="GMT+00:00",offset=0,dstSaving...
4. sun.util.calendar.ZoneInfo[id="GMT+00:00",offset=0,dstSaving...
说明:默认情况下,我的时区是印度。它将返回 执行JVM TimeZone.getDefault()的时区。所以 应用程序正在印度的服务器上运行,这将是类似的 "亚洲/加尔各答"。当您将默认时区设置为GMT时,它将其时区更改为 GMT区域。那很简单...
我无法具体解决您的问题,因为您不向我们展示您 get 时区的代码。但是我可以给你一些提示。
您的代码应该正常工作。问题可能是在(a)如何获得时区或(b)设置在其他地方的默认区域。
在设置区域以获取区域之前和之后,添加一条代码行,以记录更改的效果。在Sheeran的答案中看到此操作。
使用现代Java.Time类,而不是麻烦的旧旧日期时间类。
默认时区域适用于全部 JVM 。JVM中任何应用程序中任何线程中的任何代码均可在运行时随时更改默认值。这样的更改会影响JVM中所有应用程序的所有线程中的所有代码。因此,依靠JVM当前的默认时区是风险和不明智的,但尤其是在服务器上,甚至在Servlet容器上更是如此。
此外,服务器上的最佳实践是将默认时区保持在UTC中。但是,再次,您不应依靠该默认值。
几乎不需要设置默认值。取而代之的是,将所需/预期的时区(或ZoneId
(或ZoneOffset
))作为可选参数将其传递给Java.Time中的各种方法。坦率地说,我希望所有这些区域论点都是必需的,而不是可选的,因为大多数程序员未能考虑至关重要的区域和偏移问题。
Instant instant = Instant.now() ; // Current moment in UTC.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
您的大部分工作应该在UTC而不是分区值中完成。程序员通常应该在UTC中思考,工作,记录,交换数据和序列化数据。作为程序员,您应该在工作时停止对自己的个人时区进行临时思考,因为不断的转换在该区域内会不断转换会使您的想法陷入困境,导致错误并使您发疯。通常,您只能在用户在用户界面中的演示中分配区域。