我有计算时差的分钟问题。 它的工作正常,例如计算之间的差异 2045年和2300年。
但是当我想计算例如之间的差异时 2330(今天)和0245(明天)我得到了错误的答案。 代码如下:
// This example works
String dateStart = "2045";
String dateStop = "2300";
// This example doesnt work
//String dateStart = "2330";
//String dateStop = "0245";
// Custom date format
SimpleDateFormat format = new SimpleDateFormat("HHmm");
Date d1 = null;
Date d2 = null;
try {
d1 = format.parse(dateStart);
d2 = format.parse(dateStop);
} catch (Exception e) {
e.printStackTrace();
}
long diff = d2.getTime() - d1.getTime();
long minutes = TimeUnit.MILLISECONDS.toMinutes(diff);
System.out.println("Time in minutes: " + minutes + " minutes.");
提前致谢
答案 0 :(得分:3)
考虑使用Java 8中引入的java.time.*
包中的LocalDate,LocalDateTime,LocalTime ZonedDateTime类。它们非常便于使用,因为它们可以解决各种角落情况(例如,在不同时区测量分钟数,或在秋季和春季时间变化时)。
当你计算时差时你需要知道的是:
这意味着与以下项比较时,时间差异会有所不同:
以下是 LocalDateTime :
的摘要 LocalDateTime today2045 = LocalDateTime.of(
LocalDate.now(),
LocalTime.parse("20:45"));
LocalDateTime tomorrow0230 = LocalDateTime.of(
LocalDate.now().plusDays(1),
LocalTime.parse("02:30"));
System.out.println("Difference [minutes]: " +
Duration.between(today2045, tomorrow0230).toMinutes());
对于 ZonedDateTime 考虑到春/秋时钟的变化:
ZonedDateTime today2045 = ZonedDateTime.of(
LocalDate.now(),
LocalTime.parse("20:45"),
ZoneId.systemDefault());
ZonedDateTime tomorrow0230 = ZonedDateTime.of(
LocalDate.now().plusDays(1),
LocalTime.parse("02:30"),
ZoneId.systemDefault());
System.out.println("Difference [minutes]: " +
Duration.between(today2045, tomorrow0230).toMinutes());
有关构造函数的一些信息可以在Oracle's tutorial here中找到。
答案 1 :(得分:2)
这不起作用,因为当你创建一个只有一段时间的新日期时,假设这一天是“今天”。
你能做的是:
// This example works
String dateStart = "2045";
String dateStop = "2300";
// This example doesnt work
//String dateStart = "2330";
//String dateStop = "0245";
// Custom date format
SimpleDateFormat format = new SimpleDateFormat("HHmm");
Date d1 = null;
Date d2 = null;
try {
d1 = format.parse(dateStart);
d2 = format.parse(dateStop);
} catch (Exception e) {
e.printStackTrace();
}
// MY ADDITION TO YOUR CODE STARTS HERE
if(d2.before(d1)){
Calendar c = Calendar.getInstance();
c.setTime(d2);
c.add(Calendar.DATE, 1);
d2 = c.getTime();
}
// ENDS HERE
long diff = d2.getTime() - d1.getTime();
long minutes = TimeUnit.MILLISECONDS.toMinutes(diff);
System.out.println("Time in minutes: " + minutes + " minutes.");
但是你应该考虑使用Java 8新的日期/时间功能,或者Joda Time。
答案 2 :(得分:1)
您可以添加if语句来检查这是否是今天,如果没有,您可以添加一天,因为您正在比较时间,如果您添加全天不会有问题
if(d2.before(d1)){
d2.setTime(d2.getTime()+86400000);
}
试一试
答案 3 :(得分:-1)
这是一个已解决的问题。如果你看看Joda Time库,你会发现你可能想要的所有时间和日期操作函数:
在你的情况下,有些东西:
DateTime first = new DateTime(larger-time);
DateTime second = new DateTime(smaller-time);
DateTime difference = first.minusMillis(second.getMillis())
Joda将应对所有奇怪的边缘条件,例如天/月/年之间的滚动,月长,闰年,夏令时,时区......