[英]Different time conversion by using java.util.Date in Java
我正在使用以下代碼通過在 Java 中使用java.util.Date
class 將紀元轉換為時間。
Long scheduledTime = 1602258300000L;
Date date = new Date(scheduledTime);
System.out.println("Date obj :" + date);
以下是在兩個不同時區服務器上運行相同代碼時的輸出:
在 EDT 服務器上-
Date obj :Fri Oct 09 11:45:00 EDT 2020
在 IST 服務器上 -
Date obj :Fri Oct 09 21:15:00 IST 2020
為什么會這樣? 我只是經過毫秒。 此數據應該在所有服務器上被視為 21:15。 為什么 Date class 會改變數據?
無論服務器的時區如何,請分享一段用於獲取相同時間數據的示例代碼。
Date
object 代表一個特定的時刻,由自 Unix 紀元以來的給定毫秒數表示。
toString()
方法將該時刻轉換為基於默認時區的本地時間。 這並不是說Date
值本身“有”一個時區——它只是使用默認時區的toString()
。
此數據應該在所有服務器上被視為 21:15。
這表明您希望在所有服務器中使用印度時區,至少在轉換即時顯示時是這樣。 在對您的應用程序一無所知的情況下,我們只能說這些……除了“不要使用java.util.Date
或java.util.Calendar
;請改用java.time
類”。 它們的設計要好得多,而且您不太可能遇到這樣的問題。
我建議您使用 java.time,現代 Java 日期和時間 API,用於您的日期和時間工作。
long scheduledTime = 1_602_258_300_000L;
Instant pointInTime = Instant.ofEpochMilli(scheduledTime);
System.out.println(pointInTime);
此代碼段中的 Output 在所有時區的所有服務器上都是相同的:
2020-10-09T15:45:00Z
由於您需要 21:15,請指定印度的時區:
ZoneId serverTimeZone = ZoneId.of("Asia/Kolkata");
ZonedDateTime dateTime = pointInTime.atZone(serverTimeZone);
System.out.println(dateTime);
2020-10-09T21:15+05:30[亞洲/加爾各答]
紀元是獨立於時區的一個時間點。 所以毫秒數也表示一個時間點。 在你的情況下,那個時間點是 2020 年 10 月 9 日星期五 15:45:00 UTC。 那個時間點,印度是 21 點 15 分,北美東海岸是 11 點 45 分。 這是過時的Date
class 的一個令人困惑的特征,一方面它只代表一個時間點,另一方面它的toString
方法獲取 JVM 的時區設置並使用它來呈現要返回的字符串,從而給你錯誤的印象是您在不同時區獲得不同的Date
對象,而實際上它們是相等的。
正如其他人所指出的,您現在應該使用java.time
package 來處理時間。 如果您查看java.util.Date
的toString()
方法的文檔,它說它將 Date object 轉換為以下形式的字符串:
EEE MMM dm dd hh:mm:ss zzz yyyy
就像下面的代碼在后台運行:
public String toString(){
Date date=this;
SimpleDateFormat simpleDateFormat=new SimpleDateFormat(
"EEE MMM d m dd hh:mm:ss zzz yyyy");
simpleDateFormat.setTimeZone(TimeZone.getDefault()); //This line is important.
return simpleDateFormat.format(date);
}
現在,如果您想為某個時區格式化 Date object,您可以執行相同的操作,包括設置時區:
Long scheduledTime = 1602258300000L;
Date date = new Date(scheduledTime);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat(
"EEE MMM d m dd hh:mm:ss zzz yyyy");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("IST"));
String dateStr = simpleDateFormat.format(date);
System.out.println("Date obj :" + dateStr);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.