我有一个ec2实例在新加坡区运行。默认情况下,此实例的时区是UTC。所以我将它设置为IST假设,在这个实例中运行的应用程序会在我们存储在数据库中的IST中生成时间。新的日期()在ec2实例中给出了UTC时间,配置为IST
即我的应用程序中的新日期()在IST返回时间。但它仍然在UTC生成时间,这不是我们所需要的。
那么,如何使新的Date()在ec2实例中的IST中给出时间而不添加显式java代码?
我有一个ec2实例在新加坡区运行。默认情况下,此实例的时区是UTC。所以我将它设置为IST假设,在这个实例中运行的应用程序会在我们存储在数据库中的IST中生成时间。新的日期()在ec2实例中给出了UTC时间,配置为IST
即我的应用程序中的新日期()在IST返回时间。但它仍然在UTC生成时间,这不是我们所需要的。
那么,如何使新的Date()在ec2实例中的IST中给出时间而不添加显式java代码?
尝试设置-Duser.timezone="Asia/India"
作为环境变量,或者使用java filename -Duser.timezone="Asia/India"
做了那个。但它仍然显示UTC的时间输出 2017年1月10日星期二10:12:49 UTC。但我需要在IST –
中设置JVM的当前默认时区,只应在极端情况下进行,因为默认会影响所有代码在该JVM中运行的应用程序。并且JVM中任何应用程序中的任何代码都可以在运行时*中随时再次更改默认值。简单地指定您想要的/预期的时区,作为参数传递给方法会更容易。 –
ZonedDateTime.now(
ZoneId.of("Asia/Kolkata")
)
的Date
的toString
方法混淆性应用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方法。内部使用,但与我们在这里的讨论无关。这些旧的遗留日期 - 时间类是一个非常混乱的混乱。
你如何确定时区? 'Date'没有'getTimeZone'方法(并且'getTimeZoneOffset()'不推荐使用)。 –
我的意思是,我想知道,如果我尝试运行一个小程序,我只是在打印新的Date(),它显示UTC的时间,但我的实例配置为IST。我应该怎样做才能让我的日期对象在IST中给出时间而不添加额外的Java代码?为什么新的Date()在基于实例中设置的时区的IST中给出时间? –
我认为你需要添加更多的代码。现在,您可以考虑放弃传统的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)) –