google appengine - 时区已更改

时间:2017-03-01 12:55:52

标签: java date google-app-engine timezone

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

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

}

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

由于

2 个答案:

答案 0 :(得分:1)

看,我跟着上课了

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区。多数民众赞成......

答案 1 :(得分:1)

我无法专门解答您的问题,因为您没有向我们展示您 时区的代码。但我可以给你一些提示。

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

在设置区域之前和之后添加一行代码以获取区域,以便记录更改生效。请参阅Answer by Sheeran

中的此操作

使用现代java.time类而不是麻烦的旧遗留日期时间类。

默认时区适用于整个 JVM 。 JVM中任何应用程序的任何线程中的任何代码都可以在运行时随时更改默认值。这种更改会影响JVM中所有应用程序的所有线程中的所有代码。因此,依赖于JVM当前的默认时区通常是冒险且不明智,但在服务器上尤其如此,在Servlet容器上更是如此。

此外,服务器上的最佳做法是将默认时区保留为UTC。虽然,你不应该依赖那个默认值。

几乎不需要设置默认值。相反,将所需/预期时区显式传递为mysite/publish(或SELECT product, bedget, revenue FROM myTable UNION ALL SELECT 'total', SUM(budget) as budget, SUM(revenue) as revenue FROM myTable )作为java.time中各种方法的可选参数。坦率地说,我希望所有这些区域参数都是必需的而不是可选的,因为大多数程序员都没有考虑区域和偏移的关键问题。

a = [y[::-1] for y in a]
print(a)  # ['elppa', 'ananab', 'egnaro']

您的大部分工作应以UTC完成,而不是使用分区值。程序员通常应该在UTC中思考,工作,记录,交换数据和序列化数据。作为一名程序员,你应该在工作时不要对自己的个人时区进行狭隘的思考,因为在该区域内/外的不断转换会使你的想法变得混乱,导致错误并让你发疯。通常,您应该仅在用户界面中的用户所期望的位置分配区域。