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.Date或java.util.Calendar;使用java.time类代替”。它们的设计要好得多,您不太可能遇到这样的问题。
我建议您使用 java.time(现代 Java 日期和时间 API)来进行日期和时间工作。
\n long scheduledTime = 1_602_258_300_000L;\n Instant pointInTime = Instant.ofEpochMilli(scheduledTime);\n System.out.println(pointInTime);\nRun Code Online (Sandbox Code Playgroud)\n此代码片段的输出在所有时区的所有服务器上都是相同的:
\n\n\n2020-10-09T15:45:00Z
\n
由于您想要 21:15,请指定印度的时区:
\n ZoneId serverTimeZone = ZoneId.of("Asia/Kolkata");\n ZonedDateTime dateTime = pointInTime.atZone(serverTimeZone);\n System.out.println(dateTime);\nRun Code Online (Sandbox Code Playgroud)\n\n\n2020-10-09T21:15+05:30[亚洲/加尔各答]
\n
纪元是独立于时区的一个时间点。因此,毫秒数也表示一个时间点。在您的情况下,该时间点是 UTC 时间 2020 年 10 月 9 日星期五 15:45:00。当时印度的时间是 21:15,北美东海岸的时间是 11:45。它\xe2\x80\x99是过时类的一个令人困惑的特征Date,一方面它只代表一个时间点,另一方面它的toString方法获取JVM的时区设置并使用它来呈现要返回的字符串,从而给您一种错误的印象,即您Date在不同时区获得了不同的对象,而实际上它们是相等的。
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |