问题描述
第一个例子:
日期 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[美国/博伊西]
我喜欢这段代码的三件事是:
- 它很好地模仿了人们手工计算的方式,以及您如何向其他人解释您想要哪种计算。
- 考虑到夏令时 (DST) 的任何过渡。
- 它将实际计算留给了库方法。它不涉及您自己代码中的低级加法或除法。
链接
Oracle tutorial: Date Time 解释如何使用 java.time。
,执行此操作的一种方法如下:
Date midpoint = new Date((date1.getTime() + 2 * date2.getTime()) / 3);
,
如果您坚持使用 Date
。
这应该是一个简单的数学:
- 首先,需要计算两个日期之间的差异(以毫秒为单位)。
- 然后获取该值的 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