两个DateTime对象之间的分钟差异

3
===========================================================
Date_Time_from          | Date_Time_to
===========================================================
2018-06-16 02:00:00     |2018-06-18 02:00:00
2018-06-16 03:00:00     |2018-06-18 03:00:00
2018-06-16 04:00:00     |2018-06-18 04:00:00
2018-06-16 05:00:00     |2018-06-18 05:00:00
2018-06-16 06:00:00     |2018-06-18 06:00:00
==========================================================

我正在使用 LocalDateTime,但是在获取两个 DateTime 的差异时,它只计算了时间,而没有计算天数。

以下是代码:

LocalDateTime fromdate = LocalDateTime.of(orderYear,orderMonth,orderDay,orderHour,orderMinute,orderSeconds);
LocalDateTime todate = LocalDateTime.of(deliverYear, deliverMonth, deliverDay,deliverHour,deliverMinute,deliverSeconds);
int a = fromdate.get(ChronoField.MINUTE_OF_DAY)-todate.get(ChronoField.MINUTE_OF_DAY);

以上代码的输出为零,因为在“date_time_from”中的2小时相当于从“date_time_to”的2小时减去了120分钟。
是否有另一种方法可以获取总分钟数并包含计算日期?

你尝试过joda时间吗? - Raj
1
使用 Duration!!! 可能是重复的 如何在Joda-Time中找到两个DateTime之间的分钟差异 - MadProgrammer
1
@emaillenin JodaTime处于“维护”模式,因为Java 8+中包含了新的日期/时间API。 - MadProgrammer
3个回答

3
LocalDateTime fromdate = LocalDateTime.of(orderYear,orderMonth,orderDay,orderHour,orderMinute,orderSeconds);
LocalDateTime todate = LocalDateTime.of(deliverYear, deliverMonth, deliverDay,deliverHour,deliverMinute,deliverSeconds);
Duration difference = Duration.between(fromdate, todate);

然后您可以使用类似以下方式进行格式化...
long hours = difference.toHours();
long mins = difference.minusHours(hours).toMinutes();

// Or if you're lucky enough to be using Java 9+
//String formatted = String.format("%dhrs %02dmins", duration.toHours(), duration.toMinutesPart());
String formatted = String.format("%dhrs %02dmins", hours, mins);


只是为了证明这一点...

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public class Test {

    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
        List<LocalDateTime> from = new ArrayList<>(5);
        List<LocalDateTime> to = new ArrayList<>(5);

        from.add(LocalDateTime.parse("2018-06-16 02:00:00", formatter));
        from.add(LocalDateTime.parse("2018-06-16 03:00:00", formatter));
        from.add(LocalDateTime.parse("2018-06-16 04:00:00", formatter));
        from.add(LocalDateTime.parse("2018-06-16 05:00:00", formatter));
        from.add(LocalDateTime.parse("2018-06-16 06:00:00", formatter));

        to.add(LocalDateTime.parse("2018-06-18 02:00:00", formatter));
        to.add(LocalDateTime.parse("2018-06-18 03:00:00", formatter));
        to.add(LocalDateTime.parse("2018-06-18 04:00:00", formatter));
        to.add(LocalDateTime.parse("2018-06-18 05:00:00", formatter));
        to.add(LocalDateTime.parse("2018-06-18 06:00:00", formatter));

        for (int index = 0; index < from.size(); index++) {
            LocalDateTime fromDate = from.get(index);
            LocalDateTime toDate = to.get(index);
            String difference = formatDurationBetween(fromDate, toDate);
            System.out.println(fromDate.format(formatter) + " - " + toDate.format(formatter) + " = " + difference);
        }
    }

    public static String formatDurationBetween(LocalDateTime from, LocalDateTime to) {
        Duration difference = Duration.between(from, to);

        long days = difference.toDays();
        difference = difference.minusDays(days);
        long hours = difference.toHours();
        long mins = difference.minusHours(hours).toMinutes();

        return String.format("%dd %dh %02dm", days, hours, mins);
    }

}


输出...

2018-06-16 02:00:00 - 2018-06-18 02:00:00 = 2d 0h 00m
2018-06-16 03:00:00 - 2018-06-18 03:00:00 = 2d 0h 00m
2018-06-16 04:00:00 - 2018-06-18 04:00:00 = 2d 0h 00m
2018-06-16 05:00:00 - 2018-06-18 05:00:00 = 2d 0h 00m
2018-06-16 06:00:00 - 2018-06-18 06:00:00 = 2d 0h 00m


当然,您可以根据自己的需要制定自己的格式算法。


1
好的,基于上面的内容,你认为你需要改变什么(提示:DurationtoMinutes,但是在上面的例子中是什么在“修改”Duration)? - MadProgrammer

3

Is that what you asking for,

LocalDateTime fromDate = LocalDateTime.of(2018, 6, 16, 2, 0, 0);
LocalDateTime toDate = LocalDateTime.of(2018, 6, 18, 2, 0, 0);
long minutes = Duration.between(fromDate, toDate).toMinutes();

更新

根据下面的评论,由于前导零容易出错,因此已删除。


1
这个答案似乎很到位,因为它要求分钟。另外,虽然 00 可以用于指定 0 分钟和 0 秒,但是一旦您尝试使用 08 表示 8 分钟或 09 表示 9 秒,就会遇到麻烦,因为 Java 将带有前导 0 的数字视为八进制数。所以最好避免这种情况(除非您有意使用八进制数,当然)。 - Ole V.V.
@OleV.V. 是啊,因为天哪,我们不能让人们自己思考或者尽职调查来解决他们的问题。 - MadProgrammer

2
我希望输出仅为分钟。谢谢。
已经有两个很好的答案了,但是需要补充一点,虽然Duration类是表示两个日期时间之间差异最通用和最灵活的选项,但是还有一个更简单的选择< a href="https://docs.oracle.com/javase/9/docs/api/java/time/temporal/ChronoUnit.html#MINUTES" rel="nofollow noreferrer">ChronoUnit.MINUTES
    LocalDateTime fromdate = LocalDateTime.of(2018, Month.JUNE, 16, 2, 0, 0);
    LocalDateTime todate = LocalDateTime.of(2018, Month.JUNE, 18, 2, 0, 0);
    long diffInMinutes = ChronoUnit.MINUTES.between(fromdate, todate);
    System.out.println(diffInMinutes);

输出结果为

2880


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