为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星淼淼 2021-12-30 20:38:28
我的实用程序方法接受 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 吗?
查看完整描述

1 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

首先,该方法针对给定日期值返回的值分别是113and 114, not-119和-120。


假设您想要根据当前(默认)时区的日期差异,您可以通过调用then将Instant值转换为。LocalDateatZonetoLocalDate


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] = 114


查看完整回答
反对 回复 2021-12-30
  • 1 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信