计算Java中两个日期的最后三分之一

问题描述

我正在寻找一种方法获取两个日期的最后三分之一。

一个例子:

日期 1 = 22:00

日期 2 = 01:00(第二天)

calculateLastThird(); (输出:00:00)

第二个例子:

日期 1 = 22:25

日期 2 = 01:45(第二天)

calculateLastThird(); (输出:00:38)

我已经知道如何获得这两个日期之间的中点:

Date midpoint = new Date((date1.getTime() + date2.getTime()) / 2);

解决方法

java.time

我建议您使用 java.time,现代 Java 日期和时间 API,用于您的日期和时间工作。

    ZoneId zone = ZoneId.of("America/Boise");
    ZonedDateTime zdt1 = ZonedDateTime.of(2020,12,26,22,zone);
    ZonedDateTime zdt2 = ZonedDateTime.of(2020,27,1,zone);
    
    Duration fullElapsedTime = Duration.between(zdt1,zdt2);
    Duration twoThirds = fullElapsedTime.multipliedBy(2).dividedBy(3);
    ZonedDateTime lastThird = zdt1.plus(twoThirds);
    
    System.out.println(lastThird);

这个片段的输出是:

2020-12-27T00:00-07:00[美国/博伊西]

我喜欢这段代码的三件事是:

  1. 它很好地模仿了人们手工计算的方式,以及您如何向其他人解释您想要哪种计算。
  2. 考虑到夏令时 (DST) 的任何过渡。
  3. 它将实际计算留给了库方法。它不涉及您自己代码中的低级加法或除法。

链接

Oracle tutorial: Date Time 解释如何使用 java.time。

,

执行此操作的一种方法如下:

Date midpoint = new Date((date1.getTime() + 2 * date2.getTime()) / 3);
,

如果您坚持使用 Date
这应该是一个简单的数学:

  1. 首先,需要计算两个日期之间的差异(以毫秒为单位)。
  2. 然后获取该值的 2/3 并将其添加到第一个日期。
private static Date calculateLastThird(Date d1,Date d2) { 
        // Calculate time difference in milliseconds 
        long differenceMillis = d2.getTime() - d1.getTime();
        double millisToAdd = (2.0/3.0) * differenceMillis;
        
        Date twoThird = new Date(d1.getTime() + (long) millisToAdd);
        
        return twoThird;
    }
    
    public static void main(String args[]) {
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        try {
            Date date1= sdf1.parse("2020/12/26 22:00:00");
            Date date2= sdf1.parse("2020/12/27 01:00:00");
            SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
            System.out.println("Last third: " + sdf2.format(calculateLastThird(date1,date2)));
            
            Date date3= sdf1.parse("2020/12/26 22:25:00");
            Date date4= sdf1.parse("2020/12/27 01:45:00");
            System.out.println("Last third: " + sdf2.format(calculateLastThird(date3,date4)));
            
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
    }

以上代码的示例输出:

Last third: 00:00
Last third: 00:38