如何在Java中计算时间差?

133

我想计算两个时间段的差值,比如从19:00:00减去16:00:00。是否有Java函数可做到这一点?结果可以用毫秒、秒或分钟表示。


5
可能是 http://joda-time.sourceforge.net/ - stacker
19个回答

189

Java 8提供了一种更简洁的解决方案 - Instant和Duration

例:

import java.time.Duration;
import java.time.Instant;
...
Instant start = Instant.now();
//your code
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
System.out.println("Time taken: "+ timeElapsed.toMillis() +" milliseconds");

我真的很喜欢你的回答。非常优雅! :) - Avinash
所以,这归结为两个导入和 System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis())); 用于记录持续时间。如果其他语言可以使用类似 print("Duration: " + str(time.time()-start)) 的代码来完成此操作,那么我不认为这是 Java8 中一个好的、干净的解决方案... - Luc
11
@Luc,干净利落并不等同于简短。在Java 8版本中,正在发生的事情更加清晰明了,而且如果你想报告两个时间点之间的持续时间单位不是毫秒,或者以多个单位表示(例如1小时15分钟3.022秒而不是4503022毫秒),则更容易进行调整。 - JakeRobb

134
String time1 = "16:00:00";
String time2 = "19:00:00";

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
Date date1 = format.parse(time1);
Date date2 = format.parse(time2);
long difference = date2.getTime() - date1.getTime(); 

差异以毫秒为单位。

我修改了sfaizs的文章


7
其他时间段怎么样呢?16:00 - 19:00?我该如何计算这个时间段? - Alex K
反转变量不会带来太多好处。在这个例子中,当然,你可以反转它们并取绝对值或其他操作。但是如果你有午夜(00:00)会发生什么呢? - rj2700
1
23:15:00 - 01:15:00 怎么样? - Oleksandr
今天的08:00:00和昨天的10:00:00之间有什么区别?????我认为你提出的建议是不可行的逻辑。 - channae
我想获取两个日期(时间)之间的分钟数,但它们不包括午夜,因为我的时间范围是从05:00到22:00,所以你的答案对我很有帮助。谢谢兄弟! - Nghien Nghien

51
为了获得漂亮的时间差异,那么
// d1, d2 are dates
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.");

非常好的答案。 - Palanivelraghul
“pretty timing differences”是什么意思? - Peter Mortensen
@PeterMortensen 我的意思是以人类可读的格式表示时间差,例如“2天3小时13分钟”。 - Fizer Khan

38

Java 8

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

LocalDateTime dateTime1= LocalDateTime.parse("2014-11-25 19:00:00", formatter);
LocalDateTime dateTime2= LocalDateTime.parse("2014-11-25 16:00:00", formatter);

long diffInMilli = java.time.Duration.between(dateTime1, dateTime2).toMillis();
long diffInSeconds = java.time.Duration.between(dateTime1, dateTime2).getSeconds();
long diffInMinutes = java.time.Duration.between(dateTime1, dateTime2).toMinutes();

1
这也适用于Java SE 6和7作为后移植,以及Android - Bryan

12

就像任何其他语言一样,将您的时间段转换为Unix时间戳(即自Unix纪元以来的秒数),然后简单地相减。 然后,所得到的秒数应该被用作新的Unix时间戳,并以您想要的任何格式进行格式化。

啊,给上面的帖子(genesiss)应有的功劳,代码总是很方便的 ;) 不过,现在您也有了解释 :)


9
import java.util.Date;
...
Date d1 = new Date();
...
...
Date d2 = new Date();
System.out.println(d2.getTime()-d1.getTime()); //gives the time difference in milliseconds. 
System.out.println((d2.getTime()-d1.getTime())/1000); //gives the time difference in seconds.

而且,为了以更好的格式显示,您可以使用:

    DecimalFormat myDecimalFormatter = new DecimalFormat("###,###.###");
    System.out.println(myDecimalFormatter.format(((double)d2.getTime()-d1.getTime())/1000));

2
这个回答是重复的,没有添加任何新内容。请不要发表回答,除非你确实有新的贡献。 - DavidPostill
@DavidPostill,感谢您的提醒。 但是我需要的解决方案并没有在GENESIS的帖子中找到,那就是两行代码执行之间的时间差(例如程序的起点和终点或运行方法之前和之后的时间差,而不是一些静态时间)。 我认为这可能会有所帮助。 - Alisa

6
除了使用Period和Duration对象的最常见方法外,您可以通过另一种方式来扩展您在Java中处理时间的知识。
高级Java 8库。 用于差异的ChronoUnit。
ChronoUnit是确定两个Temporal值之间相距多远的好方法。Temporal包括LocalDate、LocalTime等。
LocalTime one = LocalTime.of(5,15);
LocalTime two = LocalTime.of(6,30);
LocalDate date = LocalDate.of(2019, 1, 29);

System.out.println(ChronoUnit.HOURS.between(one, two)); //1
System.out.println(ChronoUnit.MINUTES.between(one, two)); //75
System.out.println(ChronoUnit.MINUTES.between(one, date)); //DateTimeException

第一个示例显示的是取整而不是四舍五入。

第二个示例展示了计算不同单位的简易方法。

最后一个示例提醒我们在Java中不要搞混日期和时间 :)


5
我找到了这个清洁工具。
Date start = new Date();

//Waiting for 10 seconds
Thread.sleep(10000);

Date end = new Date();
long diff = end.getTime() - start.getTime();
String TimeTaken = String.format("[%s] hours : [%s] mins : [%s] secs",
                                 Long.toString(TimeUnit.MILLISECONDS.toHours(diff)),
                                 TimeUnit.MILLISECONDS.toMinutes(diff),
                                 TimeUnit.MILLISECONDS.toSeconds(diff));
System.out.println(String.format("Time taken %s", TimeTaken));

输出

Time taken [0] hours : [0] mins : [10] secs

4
public class timeDifference {

    public static void main(String[] args) {

        try {
            Date startTime = Calendar.getInstance().getTime();
            Thread.sleep(10000);
            Date endTime = Calendar.getInstance().getTime();

            long difference = endTime.getTime() - startTime.getTime();

            long differenceSeconds = difference / 1000 % 60;
            long differenceMinutes = difference / (60 * 1000) % 60;
            long differenceHours = difference / (60 * 60 * 1000) % 24;
            long differenceDays = difference / (24 * 60 * 60 * 1000);

            System.out.println(differenceDays + " days, ");
            System.out.println(differenceHours + " hours, ");
            System.out.println(differenceMinutes + " minutes, ");
            System.out.println(differenceSeconds + " seconds.");
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3

使用Java 8的LocalTime可以轻松实现此功能;

String time1 = "16:00:00";
String time2 = "19:00:00";

long seconds = Duration.between(LocalTime.parse(time1), LocalTime.parse(time2)).getSeconds()

Duration 还支持 toMillis() 和 toMinutes() 方法,可以代替 getSeconds() 方法来获取毫秒或分钟。


你能提供(官方的)文档链接吗?(但是请不要包含“编辑:”,“更新:”或类似的内容——回答应该看起来像今天写的。并且不要使用裸链接。) - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接