在 Java 中使用 java.util.Date 进行不同的时间转换

Ris*_*ran 7 java java.util.date

我正在通过使用java.util.DateJava 中的类使用以下代码进行纪元到时间的转换。

Long scheduledTime = 1602258300000L;
Date date = new Date(scheduledTime);
System.out.println("Date obj :" + date);
Run Code Online (Sandbox Code Playgroud)

以下是在两个不同时区服务器上运行相同代码时的输出:

在 EDT 服务器上-

Date obj :Fri Oct 09 11:45:00 EDT 2020
Run Code Online (Sandbox Code Playgroud)

在 IST 服务器上 -

Date obj :Fri Oct 09 21:15:00 IST 2020
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?我只是通过毫秒。该数据应该在所有服务器上被视为 21:15。为什么 Date 类会更改数据?

无论服务器的时区如何,请共享一段示例代码以获取相同的时间数据。

Jon*_*eet 12

一个Date对象代表一个特定的时刻,由自 Unix 纪元以来的给定毫秒数表示。

toString()方法根据默认时区将该时刻转换为本地时间。并不是该Date值本身“具有”时区 - 只是toString()使用默认时区。

该数据应该在所有服务器上被视为 21:15。

这表明您希望在所有服务器中使用印度时区,至少在转换即时显示时是这样。在不了解有关您的应用程序的更多信息的情况下,我们只能说......除了“不要使用java.util.Datejava.util.Calendar;使用java.time类代替”。它们的设计好得多,您不太可能遇到这样的问题。


Ole*_*.V. 4

java.time

\n

我建议您使用 java.time(现代 Java 日期和时间 API)来进行日期和时间工作。

\n
    long scheduledTime = 1_602_258_300_000L;\n    Instant pointInTime = Instant.ofEpochMilli(scheduledTime);\n    System.out.println(pointInTime);\n
Run Code Online (Sandbox Code Playgroud)\n

此代码片段的输出在所有时区的所有服务器上都是相同的:

\n
\n

2020-10-09T15:45:00Z

\n
\n

由于您想要 21:15,请指定印度的时区:

\n
    ZoneId serverTimeZone = ZoneId.of("Asia/Kolkata");\n    ZonedDateTime dateTime = pointInTime.atZone(serverTimeZone);\n    System.out.println(dateTime);\n
Run Code Online (Sandbox Code Playgroud)\n
\n

2020-10-09T21:15+05:30[亚洲/加尔各答]

\n
\n

什么地方出了错?

\n

纪元是独立于时区的一个时间点。因此,毫秒数也表示一个时间点。在您的情况下,该时间点是 UTC 时间 2020 年 10 月 9 日星期五 15:45:00。当时印度的时间是 21:15,北美东海岸的时间是 11:45。它\xe2\x80\x99是过时类的一个令人困惑的特征Date,一方面它只代表一个时间点,另一方面它的toString方法获取JVM的时区设置并使用它来呈现要返回的字符串,从而给您一种错误的印象,即您Date在不同时区获得了不同的对象,而实际上它们是相等的。

\n

链接

\n\n