【问题标题】:Calculating the time difference between two time stamp object - java计算两个时间戳对象之间的时间差 - java
【发布时间】:2016-12-17 21:25:21
【问题描述】:

我有 java.sql.date 和 java.sql.time 对象,我需要找到日期之间的持续时间。

所以我正在使用上面的日期和时间对象创建 java.sql.timestamp 对象

  Timestamp timestamp1 = new Timestamp(StartDate.getYear(),
        StartDate.getMonth(), StartDate.getDay(),
        StartTime.getHours(), StartTime.getMinutes(), 00,
        00);

这是我的代码

String date = "2010-01-05";
    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
    java.util.Date date3 = null;
    try {
        date3 = sdf1.parse(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    Date StartDate = new Date(date3.getTime());
    System.out.println("Date " + StartDate);

    String date2 = "2010-01-06";
    java.util.Date date4 = null;
    try {
        date4 = sdf1.parse(date2);
    } catch (ParseException exception) {
        exception.printStackTrace();
    }
    Date EndDate = new Date(date4.getTime());
    System.out.println("Date " + EndDate);

    String time = "01:00";
    DateFormat formatter = new SimpleDateFormat("HH:mm");
    java.sql.Time StartTime = null;
    try {
        StartTime = new java.sql.Time(formatter.parse(time).getTime());
    } catch (ParseException exception2) {
        exception2.printStackTrace();
    }
    System.out.println("TIMEEEEEEEEEE====" + StartTime);

    String time2 = "02:00";
    java.sql.Time EndTime = null;
    try {
        EndTime = new java.sql.Time(formatter.parse(time2).getTime());
    } catch (ParseException exception3) {
        exception3.printStackTrace();
    }
    System.out.println("TIMEEEEEEEEEE====" + EndTime);


    Timestamp timestamp1 = new Timestamp(StartDate.getYear(),
            StartDate.getMonth(), StartDate.getDay(),
            StartTime.getHours(), StartTime.getMinutes(), 00,
            00);
    Timestamp timestamp2 = new Timestamp(EndDate.getYear(),
            EndDate.getMonth(), EndDate.getDay(),
            EndTime.getHours(), EndTime.getMinutes(), 00, 00);

    long milliseconds = timestamp2.getTime() - timestamp1.getTime();
    int seconds = (int) milliseconds / 1000;

    // calculate hours minutes and seconds
    int hours = seconds / 3600;
    int minutes = (seconds % 3600) / 60;
    seconds = (seconds % 3600) % 60;
    System.out.println(hours+"h:"+minutes+"m:"+"00s");

测试用例

当我将日期指定为 2010-01-05 并将日期 2 指定为 2010-01-06 时,我得到如下输出

Date 2010-01-05
Date 2010-01-06
TIMEEEEEEEEEE====01:00:00
TIMEEEEEEEEEE====02:00:00
25h:0m:00s

当我将日期设为 2010-01-05 并将日期 2 设为 2010-01-11 时,我得到的输出为负值,如下所示

Date 2010-01-05
Date 2010-01-11
TIMEEEEEEEEEE====01:00:00
TIMEEEEEEEEEE====02:00:00
-23h:0m:00s

如果我做错了什么,请帮助我纠正。 提前致谢。

【问题讨论】:

  • 你调试过你的代码吗?日期/时间戳是否正确或已损坏?顺便说一句,您应该使用 Calendar 来构建日期而不是不推荐使用的构造函数。另请注意,时区和夏令时以及其他影响(例如闰秒)可能会影响您的手动计算,即两个日期之间的秒数可能不是您所期望的。因此,我建议使用其中一个可用的库(例如 Joda Time,或者如果您使用的是 Java 8,则使用新的内置日期库)。
  • 您正在将日期转换为时间格式,这样您就可以做到这一点。

标签: java date time timestamp


【解决方案1】:

手动时间计算:-

以毫秒 (ms) 为单位转换日期并计算两个日期之间的差异,使用以下规则:

  • 1000 毫秒 = 1 秒
  • 60 秒 = 1 分钟
  • 60 分钟 = 1 小时
  • 24 小时 = 1 天

示例:-

package com.dps2.practice.dyuti;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDifferentExample {

    public static void main(String[] args) {

        String dateStart = "08/11/2016 09:29:58";
        String dateStop = "08/12/2016 10:31:48";

        //HH converts hour in 24 hours format (0-23), day calculation
        SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

        Date d1 = null;
        Date d2 = null;

        try {
            d1 = format.parse(dateStart);
            d2 = format.parse(dateStop);

            //in milliseconds
            long diff = d2.getTime() - d1.getTime();

            long diffSeconds = diff / 1000 % 60;
            long diffMinutes = diff / (60 * 1000) % 60;
            long diffHours = diff / (60 * 60 * 1000) % 24;
            long diffDays = diff / (24 * 60 * 60 * 1000);

            System.out.print(diffDays + " days, ");
            System.out.print(diffHours + " hours, ");
            System.out.print(diffMinutes + " minutes, ");
            System.out.print(diffSeconds + " seconds.");

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

【讨论】:

  • 考虑到我们可以使用 java.time 类,自己做这个数学很愚蠢。
【解决方案2】:

您的计算问题是这样的:StartDate.getDay()

getDay() 将返回星期几(阅读 JavaDoc),不是一个月中的哪一天。您需要改用getDate()

使用您的值来说明问题:2010-01-05 将为 getDay() 返回 2,因此您将 2010-01-02 作为您的时间戳。 2010-01-11 将为 getDay() 返回 1(这是 6 天后,即 (2 + 6) % 7 = 1),因此您的第二个时间戳变为 2010-01-01。现在第二个时间戳在第一个之前,因此你得到一个负值。

但是,正如我在我的 cmets 中已经说过的,您应该尝试使用一些库或至少不弃用的内置功能来进行这些计算,从而为您省去很多麻烦(我建议您观看此视频以获得挑战的想法:https://youtube.com/watch?v=-5wpm-gesOY)。

【讨论】:

    【解决方案3】:

    java.sql 日期时间类仅用于与数据库交换数据。不要将它们用于业务逻辑。此外,它们是麻烦的、设计不佳的和令人困惑的旧日期时间类的一部分。全部避开。

    java.time

    Java 8 中内置的 java.time 类以及后来取代了您正在使用的旧类。现在简单多了。

    LocalDate ld = LocalDate.parse ( "2010-01-06" );
    LocalTime lt = LocalTime.parse ( "01:00" );
    LocalDateTime earlier = LocalDateTime.of ( ld , lt );
    
    LocalDateTime later = earlier.plusHours ( 7 );
    

    Duration 类将时间跨度表示为总秒数和纳秒数。它的toString 方法生成标准ISO 8601 格式PnYnMnDTnHnMnS 的字符串。此格式使用P 标记开始,使用T 将年-月-日与小时-分钟-秒部分分开。 DurationPeriod 类都可以解析和生成这样的字符串。

    Duration duration = Duration.between ( earlier , later );
    

    在 Java 8 中,Duration 类莫名其妙地缺少每个部分的 getter 方法:天、小时、分钟、秒、秒的分数。 Java 9 用新的getPart 方法纠正了这个遗漏。

    转储到控制台。

    System.out.println ( "earlier: " + earlier + " | later: " + later + " | duration: " + duration );
    

    较早:2010-01-06T01:00 |稍后:2010-01-06T08:00 |持续时间:PT7H

    时区

    请注意,您的输入缺少有关与 UTC 偏移或时区的任何信息。所以上面看到的数学是假设一般的 24 小时天执行的。诸如夏令时 (DST) 等现实世界的异常会被忽略。

    如果您确实想要时区,请通过atZone 方法分配它们以实例化OffsetDateTimeZonedDateTime 对象。

    【讨论】:

      【解决方案4】:

      您的问题中有一个复杂的代码。您可以使用java.util.concurrent.TimeUnit 类使其变得非常简单。

      输出

      Date Tue Jan 05 00:00:00 UTC 2010                                                                                                                                                                                                                
      Date Wed Jan 06 00:00:00 UTC 2010
      
      difference is:                                                                                                                                                                                                                
      24 hours : 1440 minutes : 86400 seconds 
      

      代码

      import java.util.*;
      import java.text.SimpleDateFormat;
      import java.util.concurrent.TimeUnit;
      
      public class HelloWorld {
      
          public static void main(String[] args) {
      
              String date = "2010-01-05";
              SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
              java.util.Date date3 = null;
              try {
                  date3 = sdf1.parse(date);
              } catch (Exception e) {
                  e.printStackTrace();
              }
              Date StartDate = new Date(date3.getTime());
              System.out.println("Date " + StartDate);
      
              String date2 = "2010-01-06";
              java.util.Date date4 = null;
              try {
                  date4 = sdf1.parse(date2);
              } catch (Exception exception) {
                  exception.printStackTrace();
              }
              Date EndDate = new Date(date4.getTime());
              System.out.println("Date " + EndDate);
      
      
      
              long dateStart = StartDate.getTime(), dateStop = EndDate.getTime();
              long diff = dateStop - dateStart;
      
              long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(diff);
              long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(diff);
              long diffInHours = TimeUnit.MILLISECONDS.toHours(diff);
      
              System.out.println("\n\ndifference is:\n");
              System.out.println(diffInHours + " hours : " + diffInMinutes + " minutes : " + diffInSeconds + " seconds");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        • 2020-05-13
        • 1970-01-01
        相关资源
        最近更新 更多