2017-01-10 46 views
0

我有一个ec2实例在新加坡区运行。默认情况下,此实例的时区是UTC。所以我将它设置为IST假设,在这个实例中运行的应用程序会在我们存储在数据库中的IST中生成时间。新的日期()在ec2实例中给出了UTC时间,配置为IST

即我的应用程序中的新日期()在IST返回时间。但它仍然在UTC生成时间,这不是我们所需要的。

那么,如何使新的Date()在ec2实例中的IST中给出时间而不添加显式java代码?

+1

你如何确定时区? 'Date'没有'getTimeZone'方法(并且'getTimeZoneOffset()'不推荐使用)。 –

+0

我的意思是,我想知道,如果我尝试运行一个小程序,我只是在打印新的Date(),它显示UTC的时间,但我的实例配置为IST。我应该怎样做才能让我的日期对象在IST中给出时间而不添加额外的Java代码?为什么新的Date()在基于实例中设置的时区的IST中给出时间? –

+1

我认为你需要添加更多的代码。现在,您可以考虑放弃传统的Date类,并使用[Java 8 Data&Time API](https://docs.oracle.com/javase/tutorial/datetime/)([docs here ](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)) –

回答

1

尝试设置-Duser.timezone="Asia/India"作为环境变量,或者使用java filename -Duser.timezone="Asia/India"

+0

做了那个。但它仍然显示UTC的时间输出 2017年1月10日星期二10:12:49 UTC。但我需要在IST –

+0

中设置JVM的当前默认时区,只应在极端情况下进行,因为默认会影响所有代码在该JVM中运行的应用程序。并且JVM中任何应用程序中的任何代码都可以在运行时*中随时再次更改默认值。简单地指定您想要的/预期的时区,作为参数传递给方法会更容易。 –

1

java.time
ZonedDateTime.now( 
    ZoneId.of("Asia/Kolkata") 
) 

运行与来自终端该开关您的Java应用程序详细

DatetoString方法混淆性应用JVM生成字符串时的当前默认时区。这误导了你认为它有一个指定的时区,但没有^。 Date对象实际上代表UTC中的一个值。避免这些麻烦的旧的遗留日期时间课程的原因之一。

这个类现在被java.time类所取代。

Instant类表示以UTC为单位的时刻。

Instant instant = Instant.now(); 

调整到您想要的时区。切勿使用3-4字母缩写,如IST。不是真正的时区。使用real time zone names

ZoneId z = ZoneId.of("Asia/Kolkata"); 
ZonedDateTime zdt = instant.atZone(z); 

这个问题其实很重要。搜索堆栈溢出了解更多讨论和示例。

不要更改主机操作系统的时区,也不要更改JVM的默认时区。您不应该依赖默认时区,因为它可以在任何时候在运行时通过JVM中任何应用程序的任何线程中的任何代码进行更改。调用java.time类时总是指定时区的可选参数,问题已解决。


^为了让事情更加混乱,实际上是Date类中的一个时区,但没有getter方法或setter方法。内部使用,但与我们在这里的讨论无关。这些旧的遗留日期 - 时间类是一个非常混乱的混乱。

相关问题