我试图以分钟计算两个日期对象之间的持续时间。
我在this stackoverflow问题的研究中找到了一些灵感。通常这似乎是正确的,但我正在经历一个测试用例的有趣行为。
当我运行下面附带的源代码(您可以简单地复制它)时,它返回66分钟而不是(正确的结果)6我目前不明白为什么。也许我现在正在监督一些事情,你能告诉我它是什么吗?
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class Test {
private SimpleDateFormat parserSDF = new SimpleDateFormat("MM/dd/yy HH:mm",
Locale.ENGLISH);
public static void main(String[] args) {
Test test = new Test();
Date begin = test.createDateFromString("10/25/09 1:54");
Date end = test.createDateFromString("10/25/09 2:00");
int duration = test.minutesDiff(begin, end);
//result is 66
System.out.println(duration);
}
public int minutesDiff(Date earlierDate, Date laterDate) {
if (earlierDate == null || laterDate == null)
return 0;
return (int) ((laterDate.getTime() / 60000) - (earlierDate.getTime() / 60000));
}
public Date createDateFromString(String dateString) {
Date date = null;
try {
date = parserSDF.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
我知道有一个这样的Joda库可以更好地计算这些东西,但如果可能的话,我希望没有外部库。
感谢您与我分享的每一个想法。
编辑:Aaaah,这可能是因为时钟变化了吗?时钟变换是在2009年10月25日,时间从早上3点到凌晨2点。这可能意味着此结果是正确的
答案 0 :(得分:5)
根据您的区域设置,它看起来像是夏令时夏令时的结束。 Here's the 2009 table; 2009年10月25日是许多语言环境的结束日期。这可以解释为什么66出现而不是6;还有60分钟。
答案 1 :(得分:1)
java.util
的日期时间 API 及其格式化 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API。
演示:
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/uu H:m", Locale.ENGLISH);
ZoneId zoneId = ZoneId.of("America/New_York");// Change it the required timezone
ZonedDateTime begin = LocalDateTime.parse("10/25/09 1:54", dtf).atZone(zoneId);
ZonedDateTime end = LocalDateTime.parse("10/25/09 2:00", dtf).atZone(zoneId);
long minutes = Duration.between(begin, end).toMinutes();
System.out.println(minutes);
}
}
输出:
6
从 Trail: Date Time 了解现代日期时间 API。
答案 2 :(得分:0)
laterDate.getTime()
以mili-seconds返回long
值。您将long值转换为int。这将导致不正确的时间顺序。