当前位置: 首页 > 知识库问答 >
问题:

本地日期对象之间的天数差异

慕容兴贤
2023-03-14
LocalDate today=LocalDate.now();

事件日期为:eventDate=LocalDate.of(年、月、日);(来自日期选择器对话框)

我在计算他们之间的天差...我找到的最短的东西是:

int DaysDifference = Period.between(eventToDisplay.getEventDate(),today).getDays();

而第一个对象是“今天”,第二个对象是“eventToDisplay.getEventDate()它对我不起作用,它显示了错误的天数。

我也尝试过这样做:

eventToDisplay.getEventDate().compareTo(today)

也没用。。。我也试着在没有乔达时间的情况下做这件事,因为我遇到了麻烦,因为我试图用日期和时间来做。。。

我发现的其他事情是漫长而复杂的,我想也许有更好的方法,没有乔达的时间。

编辑:

我刚刚试过:

  Calendar now = Calendar.getInstance();
            Calendar chosenDate=Calendar.getInstance();
            chosenDate.set(eventToDisplay.getEventDate().getYear(),eventToDisplay.getEventDate().getMonth().getValue(),eventToDisplay.getEventDate().getDayOfMonth());
            long def=  chosenDate.getTimeInMillis() - now.getTimeInMillis();
            long DaysDifference  =TimeUnit.MILLISECONDS.toDays(def);

对我没用

编辑:这已经为我工作:

 LocalDate today=LocalDate.now();
            Calendar now = Calendar.getInstance();
            now.set(today.getYear(),today.getMonthValue(),today.getDayOfMonth());
            Calendar chosenDate=Calendar.getInstance();
            chosenDate.set(eventToDisplay.getEventDate().getYear(),eventToDisplay.getEventDate().getMonthValue(),eventToDisplay.getEventDate().getDayOfMonth());
            long def=  chosenDate.getTimeInMillis() - now.getTimeInMillis();
            long daysDifference =TimeUnit.MILLISECONDS.toDays(def);

共有2个答案

华项明
2023-03-14

因为您可以使用java中的LocalDate。时间,现代的Java日期和时间API,我强烈建议您坚持使用Java。时间当你知道如何计算时,计算差异是简单而直接的:

    LocalDate today = LocalDate.now(ZoneId.systemDefault());
    LocalDate eventDate = LocalDate.of(2021, 5, 5);

    long differenceDays = ChronoUnit.DAYS.between(today, eventDate);
    
    System.out.println("Difference is " + differenceDays + " days.");

我今天跑步时的输出(4月18日在我的tme区域):

差17天。

如果你的日期选择器使用基于0的月份(有些日期选择器疯狂地使用1月到12月的11日的0),记得在将月数传递给LocalDate之前,在月数中添加1。

    int DaysDifference = Period.between(eventToDisplay.getEventDate(),today).getDays();

Period类表示年、月和日的周期。由于月份有不同的长度,所以期间与任何确切的天数都不对应,所以在这里使用它不是合适的类。您尝试使用它的getDays方法,它提供时段的天数部分,而不是月份或年份。因此,如果这两天相隔不到一个月,你会得到正确的结果,否则不会。例如,如果两个日期相隔1个月3天,您将只获得3天。

不止一次尝试中使用的日历类的设计很差,而且已经过时很久了。用它正确计算日子真的很麻烦,所以难怪你的尝试会产生错误的结果。

你的两次尝试都是错误的,至少有两个原因:

  1. 日历有日期和时间。因此,通过找出以毫秒为单位的差异,除以你认为一天中的毫秒数,你将得到不同的结果,这取决于每个日历对象中恰好出现的时间。你的代码调用日历。getInstance()两次。在极端情况下,您的代码可能会在午夜运行,因此第一个日历中的时间将接近23:59:59,第二个接近00:00,这几乎肯定会给您一个1天的错误
  2. 一天并不总是24小时。夏季时间(DST)是最常见的,但不是约会有时是23小时、25小时或其他长度的唯一原因。例如,如果您试图在spring forward中计算一天只有23小时或23小时30分钟的天数,那么您的代码将计算的天数太少

此外,你所说的这句话绝对是错误的:

    now.set(today.getYear(),today.getMonthValue(),today.getDayOfMonth());

您使用的是LocalDate中的基于1的月份号,例如4表示四月,而在Calendar中使用基于0的月份号,例如4表示五月。因此,您的日历将关闭1个月。因为我没有你的完整代码,是可能在某些情况下平衡了另一个错误,导致其他日历是1个月,我不知道。由于月份有不同的长度,有时您仍然会得到长达3天的错误。

丁安宜
2023-03-14

你可以这样使用:

    Calendar now = Calendar.getInstance();

    Calendar end=Calendar.getInstance();
    end.set(<year>, <month>, <day>);

    long def=  end.getTimeInMillis() - now.getTimeInMillis();

    long days =TimeUnit.MILLISECONDS.toDays(def);
 类似资料:
  • 问题内容: 在我的代码中,日期之间的差异是错误的,因为它应该是38天而不是8天。我该如何解决? 问题答案: 问题出在变量中。月以Capital M表示。 尝试更改为: 有关更多信息,请参见此javadoc。 编辑: 这是代码,如果您想以注释的方式打印差异: 希望对您有所帮助!

  • 问题内容: 我想得到两个Java Date对象之间的区别。我使用了Joda-Time库。但是问题是我得到的天数差异大于实际的天数差异。 这是我的代码段: 这是我的输出: 在这里,为什么将“ 06/22/2010”设为1月22日?有人遇到类似的问题吗? 帮我朋友..提前感谢.. 问题答案: 月份是MM 在您的情况下: DateFormat formatter = new SimpleDateForm

  • 问题内容: 我需要找到两个日期之间的天数:一个是来自报表,另一个是当前日期。我的片段: 这是一个私有方法,并且today是Date对象,仅供您说明。我关注了Java论坛中的两篇文章Thread 1 / Thread 2。 它在独立程序中可以正常工作,尽管当我将其包含在逻辑中以从报告中读取时,我会在值上获得不同寻常的区别。 为什么会发生,如何解决? 编辑: 与实际天数相比,我得到的天数更多。 问题答

  • 问题内容: 我正在尝试这样的事情,我试图从组合框中获取日期 我无法减去结束日期和开始日期如何获得开始日期和结束日期之间的差额? 问题答案: 如orange80所指出的,在超过夏令时(或leap秒)时,这将不起作用,并且在一天中的不同时间使用时,也可能无法给出预期的结果。使用JodaTime可能更容易获得正确的结果,因为我知道8之前纯Java的唯一正确方法是使用Calendar的add和before

  • 返回两个日期之间相差的天数。 计算 Date 对象之间的差异(以天为单位)。 const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24); getDaysDiffBetweenDates(new Date('2017-12-13'), ne

  • 我使用Spring Boot 1.5.4、HiberNate 5.2.10、Spring Data REST、HATEOAS、JDK8和LocalDate和LocalDateTime。我的计算机在CEST时区,但我希望应用程序在UTC中工作,所以我设置了application.properties: 根据这篇文章,我不想更改JVM的时区,因为这似乎不是最佳实践。 Spring Data REST公