簡體   English   中英

Java中使用java.util.Date進行不同時間轉換

[英]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.Datejava.util.Calendar ;請改用java.time類”。 它們的設計要好得多,而且您不太可能遇到這樣的問題。

java.時間

我建議您使用 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.DatetoString()方法的文檔,它說它將 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM