如何在java中找到两个日期之间的差异持续时间?

J88*_*888 101 java date-arithmetic

我有两个DateTime对象,需要找到它们的差异持续时间,

我有以下代码,但不知道如何继续它以获得预期的结果如下:

      11/03/14 09:30:58
      11/03/14 09:33:43
      elapsed time is 02 minutes and 45 seconds
      -----------------------------------------------------
      11/03/14 09:30:58 
      11/03/15 09:30:58
      elapsed time is a day
      -----------------------------------------------------
      11/03/14 09:30:58 
      11/03/16 09:30:58
      elapsed time is two days
      -----------------------------------------------------
      11/03/14 09:30:58 
      11/03/16 09:35:58
      elapsed time is two days and 05 mintues
Run Code Online (Sandbox Code Playgroud)

    String dateStart = "11/03/14 09:29:58";
    String dateStop = "11/03/14 09:33:43";

    Custom date format
    SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd HH:mm:ss");

    Date d1 = null;
    Date d2 = null;
    try {
        d1 = format.parse(dateStart);
        d2 = format.parse(dateStop);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    // Get msec from each, and subtract.
    long diff = d2.getTime() - d1.getTime();
    long diffSeconds = diff / 1000 % 60;
    long diffMinutes = diff / (60 * 1000) % 60;
    long diffHours = diff / (60 * 60 * 1000);
    System.out.println("Time in seconds: " + diffSeconds + " seconds.");
    System.out.println("Time in minutes: " + diffMinutes + " minutes.");
    System.out.println("Time in hours: " + diffHours + " hours.");
Run Code Online (Sandbox Code Playgroud)

Sha*_*med 176

可以使用Java内置类TimeUnit以更好的方式处理日期差异转换.它提供了实用方法:

Date startDate = // Set start date
Date endDate   = // Set end date

long duration  = endDate.getTime() - startDate.getTime();

long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案. (3认同)
  • 不依赖第三方库. (3认同)
  • 或者,long diffInSeconds = TimeUnit.SECONDS.convert(duration,TimeUnit.MILLSECONDS); (2认同)
  • 我赞成那项议案。这个答案是最好的。 (2认同)

小智 66

尝试以下方法

{
        Date dt2 = new DateAndTime().getCurrentDateTime();

        long diff = dt2.getTime() - dt1.getTime();
        long diffSeconds = diff / 1000 % 60;
        long diffMinutes = diff / (60 * 1000) % 60;
        long diffHours = diff / (60 * 60 * 1000);
        int diffInDays = (int) ((dt2.getTime() - dt1.getTime()) / (1000 * 60 * 60 * 24));

        if (diffInDays > 1) {
            System.err.println("Difference in number of days (2) : " + diffInDays);
            return false;
        } else if (diffHours > 24) {

            System.err.println(">24");
            return false;
        } else if ((diffHours == 24) && (diffMinutes >= 1)) {
            System.err.println("minutes");
            return false;
        }
        return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案忽略了定义天数开始和结束的时区.这个答案忽略了夏令时和其他异常,这意味着一天的长度并不总是24小时.查看使用Joda-Time或java.time库的正确答案. (19认同)
  • 罗勒指出,这个答案是不正确的.如果在夏令时期间结束日期发生但是开始日期不是,则它给出错误的天数. (3认同)

May*_*urB 44

使用Joda-Time

DateTime startTime, endTime;
Period p = new Period(startTime, endTime);
long hours = p.getHours();
long minutes = p.getMinutes();
Run Code Online (Sandbox Code Playgroud)

Joda Time有一个时间间隔的概念:

Interval interval = new Interval(oldTime, new Instant());
Run Code Online (Sandbox Code Playgroud)

另一个例子 日期差异

还有一个链接

或者使用Java-8(集成了Joda-Time概念)

Instant start, end;//
Duration dur = Duration.between(start, stop);
long hours = dur.toHours();
long minutes = dur.toMinutes();
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.Joda时间是要走的路 (2认同)
  • 清晰可读,也可以在andoid中工作. (2认同)

joh*_*rka 12

以下是Java 8中问题的解决方法,就像shamimz的答案一样.

资料来源:http: //docs.oracle.com/javase/tutorial/datetime/iso/period.html

LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1960, Month.JANUARY, 1);

Period p = Period.between(birthday, today);
long p2 = ChronoUnit.DAYS.between(birthday, today);

System.out.println("You are " + p.getYears() + " years, " + p.getMonths() + " months, and " + p.getDays() + " days old. (" + p2 + " days total)");
Run Code Online (Sandbox Code Playgroud)

代码生成类似于以下内容的输出:

You are 53 years, 4 months, and 29 days old. (19508 days total)
Run Code Online (Sandbox Code Playgroud)

我们必须使用LocalDateTime http://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html来获得小时,分钟和秒的差异.


小智 6

Date d2 = new Date();
Date d1 = new Date(1384831803875l);

long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000);
int diffInDays = (int) diff / (1000 * 60 * 60 * 24);

System.out.println(diffInDays+"  days");
System.out.println(diffHours+"  Hour");
System.out.println(diffMinutes+"  min");
System.out.println(diffSeconds+"  sec");
Run Code Online (Sandbox Code Playgroud)


小智 6

你可以创建一个类似的方法

public long getDaysBetweenDates(Date d1, Date d2){
return TimeUnit.MILLISECONDS.toDays(d1.getTime() - d2.getTime());
}
Run Code Online (Sandbox Code Playgroud)

此方法将返回2天之间的天数.


Gho*_*man 5

正如Michael Borgwardt在他的回答中写道:

int diffInDays = (int)( (newerDate.getTime() - olderDate.getTime()) 
                 / (1000 * 60 * 60 * 24) )
Run Code Online (Sandbox Code Playgroud)

请注意,这适用于UTC日期,因此如果您查看本地日期,差异可能是休息日.并且由于夏令时,需要采用完全不同的方法使其与本地日期一起正常工作.

  • 你对当地日期的看法是不正确的.getTime()方法,根据API doc*返回自此Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数.*如果两个数字具有相同的单位,则可以安全地添加和减去他们. (2认同)

mko*_*bit 5

在 Java 8 中,您可以使用DateTimeFormatterDurationLocalDateTime。这是一个例子:

final String dateStart = "11/03/14 09:29:58";
final String dateStop = "11/03/14 09:33:43";

final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.MONTH_OF_YEAR, 2)
        .appendLiteral('/')
        .appendValue(ChronoField.DAY_OF_MONTH, 2)
        .appendLiteral('/')
        .appendValueReduced(ChronoField.YEAR, 2, 2, 2000)
        .appendLiteral(' ')
        .appendValue(ChronoField.HOUR_OF_DAY, 2)
        .appendLiteral(':')
        .appendValue(ChronoField.MINUTE_OF_HOUR, 2)
        .appendLiteral(':')
        .appendValue(ChronoField.SECOND_OF_MINUTE, 2)
        .toFormatter();

final LocalDateTime start = LocalDateTime.parse(dateStart, formatter);
final LocalDateTime stop = LocalDateTime.parse(dateStop, formatter);

final Duration between = Duration.between(start, stop);

System.out.println(start);
System.out.println(stop);
System.out.println(formatter.format(start));
System.out.println(formatter.format(stop));
System.out.println(between);
System.out.println(between.get(ChronoUnit.SECONDS));
Run Code Online (Sandbox Code Playgroud)


Tar*_*Ray 5

它对我有用,可以尝试一下,希望它会有所帮助。如有任何疑问,请告诉我。

Date startDate = java.util.Calendar.getInstance().getTime(); //set your start time
Date endDate = java.util.Calendar.getInstance().getTime(); // set  your end time

long duration = endDate.getTime() - startDate.getTime();


long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);

Toast.makeText(MainActivity.this, "Diff"
        + duration + diffInDays + diffInHours + diffInMinutes + diffInSeconds, Toast.LENGTH_SHORT).show(); **// Toast message for android .**

System.out.println("Diff" + duration + diffInDays + diffInHours + diffInMinutes + diffInSeconds); **// Print console message for Java .**
Run Code Online (Sandbox Code Playgroud)