【问题标题】:Java Date is giving incorrect time difference, jumps 1 hour aheadJava Date 给出的时差不正确,提前 1 小时
【发布时间】:2014-04-12 11:59:09
【问题描述】:

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

【问题讨论】:

  • verschil 在哪里定义?还是您为我们将代码编辑成英文而错过了那个?
  • 我做到了,对此感到抱歉
  • DateFormat 接受 Date 作为参数,不长。真的可以编译吗?
  • 请做一个完整的可运行示例。当您不知道出了什么问题时,向我们展示您认为的问题通常是在浪费时间。

标签: java date time duration


【解决方案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。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      在您的构造函数中添加这一行以将日期格式设置为 UTC 时区,它应该会按照您的预期输出 01:30:

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

      【讨论】:

      • 这确实是解决方案。谢谢博安。
      猜你喜欢
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多