java - 时间和时区不对应 - Linux

标签 java linux date timezone debian

我一直在想为什么我无法确定时间。我的服务器的时间搞砸了。 实际上,我尝试了一些网站建议的“ntpdate”命令。 但是,“date”命令仍然显示问题。

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

因为时区和时间本身不一致,我的程序坏了。我的服务是通过 Java 的 Date 类获取今天的日期。并且,“new Date()”取决于服务器日期。

有什么办法可以解决这个问题吗?我尝试使用“ntpdate”与某些服务器同步时间。但是,它永远行不通。

最佳答案

硬件或操作系统故障

如果你的服务器计算机的硬件时钟出现故障或者你的操作系统出现了严重的问题,那么编程可能就救不了你了。在其他网站上寻求帮助,例如:

Java 可以用日期时间误导你

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

JVM 有自己的当前默认时区,可能与操作系统的时区不同。阅读下文了解详情。

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

指定所需时区

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

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

乔达时间

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

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

请注意,Joda-Time 和 java.time 都使用 immutable objects ,我们不是修改(“变异”)对象的值,而是根据原始对象的属性创建新实例。这提供了内置的 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" ) );

关于java - 时间和时区不对应 - Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25734656/

相关文章:

java - 新手Android错误: java. lang.NoClassDefFoundError : android. content.ClipboardManager

java - 在 Java 中设置对话框窗口大小的推荐方法是什么

linux - 如何在linux shell脚本输出中缩短文件路径

c - 如何在 ANSI C 中获取 X 之前的天数和小时数

python - 将日期之间的数据从 MYSQL 提取到 pandas 中

java - Java 中的继承和泛型的使用

java - 在内部类类型上使用 instanceof 时出现 "illegal generic type of instanceof"?

Java Swing,从系统托盘恢复在 Linux 中不起作用

linux - Posix 线程与互斥体同步

sql - SQL SERVER 2008 R2 中无效日期的 DATE 与 DATETIME 转换