Java Date提供了不正确的时差,提前1小时跳转

时间:2014-03-09 12:39:01

标签: java date time duration

我的时差显示输出不正确,我正在尝试计算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可以让这更容易,但我不应该使用任何其他库。

3 个答案:

答案 0 :(得分:3)

它正确计算差异为5400000毫秒(1.5小时),但由于我认为是时区,因此将其格式化为02:30。

在构造函数中添加此行以将日期格式设置为UTC时区,并且应该按预期输出01:30:

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

答案 1 :(得分:1)

时间是自称为纪元的时刻以来的毫秒数。在您的代码中,您计算​​时刻之间的差异,然后将结果解释为时间戳,但事实并非如此。

计算结果是两个时间戳之间的差异(以毫秒为单位)。如果您希望以小时和分钟打印,请执行以下操作:

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);
}

答案 2 :(得分:1)

java.util 的日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern date-time 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。