Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 谷歌appengine-时区改变_Java_Date_Google App Engine_Timezone - Fatal编程技术网

Java 谷歌appengine-时区改变

Java 谷歌appengine-时区改变,java,date,google-app-engine,timezone,Java,Date,Google App Engine,Timezone,在ServletContextListener初始化方法中,我们将时区设置为 public void contextInitialized(ServletContextEvent event) { TimeZone.setDefault(TimeZone.getTimeZone("GMT+00:00")); } 但是当我检查servlet和过滤器中的时区信息时,时区发生了变化。 任何人都知道可能的原因 谢谢看,我上了下面的课 public class TimeZ { public static

在ServletContextListener初始化方法中,我们将时区设置为

public void contextInitialized(ServletContextEvent event) {
TimeZone.setDefault(TimeZone.getTimeZone("GMT+00:00"));
}

但是当我检查servlet和过滤器中的时区信息时,时区发生了变化。 任何人都知道可能的原因


谢谢

看,我上了下面的课

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时,它将其时区更改为 格林尼治时区。这很简单


看,我上过以下课

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时,它将其时区更改为 格林尼治时区。这很简单


我无法具体回答您的问题,因为您没有向我们展示如何获取时区的代码。但我可以给你一些建议

你的代码应该正常工作。问题可能在于(a)如何获得时区或(b)在其他地方设置默认时区

在设置区域之前和之后添加一行代码,以获取区域,从而记录生效的更改。请在中查看此操作

使用现代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中思考、工作、记录、交换数据和序列化数据。作为一名程序员,你应该停止在工作中狭隘地思考你自己的个人时区,因为不断地在该时区内外转换会搅乱你的想法,导致错误,并让你发疯。通常,您应该仅在用户界面的演示文稿中用户期望的位置分配区域

我无法具体回答您的问题,因为您没有向我们展示如何获取时区的代码。但我可以给你一些建议

你的代码应该正常工作。问题可能在于(a)如何获得时区或(b)在其他地方设置默认时区

在设置区域之前和之后添加一行代码,以获取区域,从而记录生效的更改。请在中查看此操作

使用现代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中思考、工作、记录、交换数据和序列化数据。作为一名程序员,你应该停止在工作中狭隘地思考你自己的个人时区,因为不断地在该时区内外转换会搅乱你的想法,导致错误,并让你发疯。通常,您应该仅在用户界面的演示文稿中用户期望的位置分配区域

可能另一个代码位置也会调用时区.setDefault()。否。我们没有在任何地方设置。请显示调用get的源代码。可能另一个代码位置也调用了
时区。setDefault()
。否。我们没有在任何地方设置。请显示调用get的源代码,好吗?我们的服务器仅在美国运行。即使我们正在设置时区。对不起,默认情况下,您可以使用getDefault获得时区,它会根据程序运行的时区创建时区。例如,对于在日本运行的程序,getDefault基于日本标准时间创建时区对象。但是在ServletContextListener中,我们将JVM默认时区设置为TimeZone.setDefault(TimeZone.getTimeZone(“GMT+00:00”))。为什么会改变?因为您正在将Gmt时间设置为默认时区。如果默认时区为印度,则为exp