簡體   English   中英

Java 日期給出的時差不正確,提前 1 小時

[英]Java Date is giving incorrect time difference, jumps 1 hour ahead

我的時差顯示不正確的輸出,我正在嘗試計算 startTime 和 endTime 之間的時差。

    Date time1, time2;
    long difference;

    SimpleDateFormat df = new SimpleDateFormat("HH:mm");

    public Time(String startTime, String endTime)
    {
        this.startTime = startTime;
        this.endTime = endTime;

        time1 = new Time("16:30", "18:00"); //example

        try
        {
            time1 = df.parse(startTime);
            time2 = df.parse(endTime);
        }
        catch(Exception e) {
           System.out.println("invalid time");
        }
    }

    public String getDifference()
    {
         difference = (time2.getTime() - time1.getTime());
         return df.format(difference); //output = 02:30, should be 01:30
    }

我知道Joda-Time可以使這更容易,但我不應該使用任何其他庫。

它將差異正確計算為 5400000 毫秒(1.5 小時),但由於時區的原因,將其格式化為 02:30。

在您的構造函數中添加這一行以將日期格式設置為 UTC 時區,它應該像您期望的那樣輸出 01:30:

df.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));

時間是自稱為紀元的時刻以來的毫秒數。 在您的代碼中,您計算​​與時刻之間的差異,然后將結果解釋為時間戳,但事實並非如此。

計算結果是兩個時間戳之間的差異,以毫秒為單位。 如果您希望以小時和分鍾為單位打印,請執行以下操作:

public String getDifference() {
    difference = (time2.getTime() - time1.getTime()) / 1000L;
    long hours = difference/3600;
    difference %= 3600;
    long minutes = difference/60;
    difference %= 60;
    long seconds = difference;

    return String.format("%d:%02d:%02d", hours, minutes, seconds);
}

java.util的日期時間 API 及其格式化 API SimpleDateFormat已過時且容易出錯。 建議完全停止使用它們並切換到現代日期時間 API

演示:

import java.time.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:m", Locale.ENGLISH);
        LocalTime begin = LocalTime.parse("16:30", dtf);
        LocalTime end = LocalTime.parse("18:00", dtf);
        Duration duration = Duration.between(begin, end);
        System.out.println(duration);

        // Custom format
        // ##########################################Java-8##########################################
        System.out.println(String.format("%d:%d", duration.toHours(), duration.toMinutes() % 60));
        // ##########################################################################################

        // ##########################################Java-9##########################################
        System.out.println(String.format("%d:%d", duration.toHoursPart(), duration.toMinutesPart()));
        // ##########################################################################################
    }
}

輸出:

PT1H30M
1:30
1:30

Trail: Date Time了解現代日期時間 API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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