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

计算两个时间戳对象之间的时间差-java,java,date,time,timestamp,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(),

我有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
如果我做错了什么,请帮助我改正。
提前感谢。

手动计算时间:-

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

    }

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

计算的问题是:
StartDate.getDay()
等等

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

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


但是,正如我在评论中所说的,您应该尝试使用一些库或至少是未弃用的内置功能来进行这些计算,从而为您省去很多麻烦(我建议您观看此视频以了解挑战:).

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
方法生成标准格式的字符串
PnYnMnDTnHnMnS
。此格式使用
P
标记开始,使用
T
将年-月-日与时-分-秒部分分开。
Duration
Period
类都可以解析和生成这样的字符串

Duration duration = Duration.between ( earlier , later );
在Java8中,
Duration
类莫名其妙地缺少每个部分的getter方法:天、小时、分钟、秒、秒的分数。Java9通过新的
getPart
方法纠正了这一遗漏

转储到控制台

System.out.println ( "earlier: " + earlier + " | later: " + later + " | duration: " + duration );
之前:2010-01-06T01:00 |之后:2010-01-06T08:00 |持续时间:PT7H

时区 请注意,您的输入缺少有关UTC或时区偏移量的任何信息。因此,上面的数学是假设24小时工作制的。忽略现实世界中的异常情况,如夏令时(DST)


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

您调试代码了吗?日期/时间戳是否正确或已损坏?顺便说一句,您应该使用
Calendar
来构建日期,而不是不推荐使用的构造函数。还请注意,时区和夏令时以及其他影响(例如闰秒)可能会影响手动计算,即两个日期之间的秒数可能不是您预期的。因此,我建议使用一个可用的库(例如Joda Time,或者如果您使用Java 8,则使用新的内置日期库)。作为参考:您正在将日期转换为时间格式,这样您就可以得到这样的结果。考虑到我们有Java.Time类可供使用,您自己做这个数学是愚蠢的。