我的实用工具方法接受Java 7日期(因为这是外部的,所以我无法控制它),但是需要计算日期差异。我正在使用Java 8 ChronoUnit方法来精确地避免闰年、夏令等方面的所有问题。
public static long daysBetweenDatesWithSign(Date d1, Date d2) {
Instant instant1 = d1.toInstant();
Instant instant2 = d2.toInstant();
long diff = ChronoUnit.DAYS.between(instant1, instant2);
return diff;
}结果不是我想要的,因为它需要时间考虑。
( [Nov.5,2018 11:00am] , [Mar.5,2019 10:00am] )给出的是-119而不是-120。
( [Nov.5,2018 11:00am] , [Mar.5,2019 3:00pm] )给了-120。
我需要这两种方法来提供-120,因为我的功能应该是一天/无时间的比较。
但是我不想回到Java 7的Calendar,因为闰年的问题等等。准确地说,我需要新的Java 8方法,但是我能在Java 8中比较天数/无时间吗?
发布于 2018-11-05 18:07:24
首先,该方法为给定日期值返回的值分别是113和114,而不是-119和-120。
假设您想要根据当前(默认)时区的日期差异,可以通过调用Instant (然后调用toLocalDate )将atZone值转换为toLocalDate。
public static long daysBetweenDatesWithSign(Date d1, Date d2) {
return daysBetweenDatesWithSign(d1, d2, ZoneId.systemDefault());
}
public static long daysBetweenDatesWithSign(Date d1, Date d2, ZoneId zone) {
LocalDate instant1 = d1.toInstant().atZone(zone).toLocalDate();
LocalDate instant2 = d2.toInstant().atZone(zone).toLocalDate();
return ChronoUnit.DAYS.between(instant1, instant2);
}测试
public static void main(String[] args) throws ParseException {
test("Nov.11,2018 11:00am", "Mar.5,2019 10:00am");
test("Nov.11,2018 11:00am", "Mar.5,2019 3:00pm");
}
public static void test(String d1, String d2) throws ParseException {
SimpleDateFormat fmt = new SimpleDateFormat("MMM.d,yyyy hh:mma");
System.out.println("[" + d1 + "] , [" + d2 + "] = " +
daysBetweenDatesWithSign(fmt.parse(d1), fmt.parse(d2)));
}输出
[Nov.11,2018 11:00am] , [Mar.5,2019 10:00am] = 114
[Nov.11,2018 11:00am] , [Mar.5,2019 3:00pm] = 114https://stackoverflow.com/questions/53159149
复制相似问题