计算两个时间戳对象之间的时差 - java

时间:2016-08-11 08:35:44

标签: java date time timestamp

我有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);

这是mycode

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和date2作为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和date2作为2010-01-11给出时,我得到的负值如下所示

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

如果我做错了,请帮我纠正。 提前谢谢。

4 个答案:

答案 0 :(得分:5)

手动时间计算: -

以毫秒(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();
        }

    }

}

答案 1 :(得分:3)

您的计算问题是: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。现在第二个时间戳在第一个时间戳之前,因此你得到一个负值。

但是,正如我在评论中已经说过的那样,您应该尝试使用一些库或至少使用不推荐的内置功能进行这些计算,以免给您带来很多麻烦(我建议您观看此视频以获取挑战的想法:https://youtube.com/watch?v=-5wpm-gesOY)。

答案 2 :(得分:2)

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方法:days,hours,minutes,seconds,fraction of of second。 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个对象。

答案 3 :(得分:1)

这是您在问题中的复杂代码。您可以使用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");
    }
}

<强>代码

BOOST_REQUIRE([1.61])
BOOST_SYSTEM
BOOST_TEST