代码之家  ›  专栏  ›  技术社区  ›  Amodar

Java Date给出的时差不正确,提前1小时跳转

  •  3
  • Amodar  · 技术社区  · 10 年前

    我的时间差显示了错误的输出,我试图计算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 回复  |  直到 7 年前
        1
  •  3
  •   Boann    10 年前

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

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

    df.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
    
        2
  •  1
  •   Rene.v.P.    10 年前

    Time是从称为epoch的时刻开始的毫秒数。在代码中,您计算到个时刻之间的差值,然后将结果解释为时间戳,但它不是。

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

    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
  •  1
  •   Arvind Kumar Avinash    4 年前

    的日期时间API java.util 以及它们的格式化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
    

    从了解现代日期时间API Trail: Date Time .