猿问

没有时间组件的 Java 8 天差异

我的实用程序方法接受 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因为我的功能应该是白天/无时间比较。


但是Calendar由于闰年等问题,我不想回到 Java 7 。准确地说,我需要新的 Java 8 方法,但是我可以比较 Java 8 中的 Days/no-Time 吗?


繁星淼淼
浏览 150回答 1
1回答

慕容3067478

首先,该方法针对给定日期值返回的值分别是113and 114, not-119和-120。假设您想要根据当前(默认)时区的日期差异,您可以通过调用then将Instant值转换为。LocalDateatZonetoLocalDatepublic 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] = 114
随时随地看视频慕课网APP

相关分类

Java
我要回答