时间与时间时区不对应 - Linux

时间:2014-09-08 23:34:32

标签: java linux date timezone debian

我被困在为什么我无法解决时间问题。我的服务器的时间搞砸了。 实际上,我试过" ntpdate"一些网站建议的命令。 但是," date"命令仍然显示问题。

更详细地说,我的服务器正在使用UTC0。这显示23:28:45。但实际上,实际时间是16:31:XX。所以,大约有7个小时的差异。

因为Timezone&时间本身不一致,我的程序坏了。我的服务今天按日期类Java来获取。而且,"新的日期()"取决于服务器日期。

有没有办法解决这个差异?我试过" ntpdate"与某些服务器同步时间。但是,它永远不会奏效。

1 个答案:

答案 0 :(得分:1)

硬件或操作系统故障

如果服务器计算机的硬件时钟出现故障或您遇到严重的操作系统问题,则编程可能无法保存。在其他网站上寻求帮助,例如:

Java可能会误导您的日期时间

您是否知道java.util.Date和.Calendar上的toString方法应用JVM的当前默认时区?这会在日期时间对象上创建时区的错觉,而实际上没有时区。在您的情况下,这种行为可能会或可能不会使您感到困惑。

JVM有自己的当前默认时区,可能与操作系统的时区不同。请阅读下面的详细信息。

因此,请使用您的操作系统实用程序而不是Java来验证当前的日期时间和时区/区域设置。在确定硬件和操作系统之后,请将注意力转向Java。

指定所需时区

此外,如果操作系统上的当前日期时间正确但操作系统设置为不需要的时区,则可以在Java代码中处理该日期时间。

实际上,您应该以指定期望/预期时区的方式编写Java代码,而不是依赖隐式默认值。在您的情况下,我们不能总是相信主机操作系统被设置为正确的时区,这反过来又会通知JVM的默认时区。此外,Java代码可以更改JVM的当前默认时间,这会影响该JVM中运行的所有线程中的所有代码。所以这是指定时区而不是依赖默认值的另一个原因。

约达时间

要在代码中指定时区,您必须使用体面的日期时间库。这意味着在Java 8中使用Joda-Time或新的java.time package。避免使用java.util.Date和.Calendar类,因为它们非常麻烦。

在Joda-Time和java.time中,日期时间类确实知道自己分配的时区。这与没有指定时区的java.util.Date形成对比。您可以轻松调整到另一个时区。

请注意,Joda-Time和java.time都使用immutable objects,而不是修改(" mutate")对象的值,我们根据原始对象创建新实例属性。这提供了内置的thread-safety

// Three date-time objects, but all represent the same simultaneous moment in the timeline of the Universe.
DateTime nowUtc = DateTime.now( DateTimeZone.UTC );
DateTime nowParis = nowUtc.withZone( DateTimeZone.forID( "Europe/Paris" ) );
DateTime nowKolkata = nowUtc.withZone( DateTimeZone.forID( "Asia/Kolkata" ) );