本地日期对象之间的天差

时间:2016-07-23 11:47:56

标签: android date time

LocalDate today=LocalDate.now();

活动日期是: eventDate=LocalDate.of(year, monthOfYear,dayOfMonth);(来自日期选择器对话框)

我试图计算它们之间的天差...我发现的最短的事情就是:

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

虽然第一个对象是"今天",而第二个对象是" eventToDisplay.getEventDate()。"它对我没有用,它显示错误的天数。

我也试过这样做:

eventToDisplay.getEventDate().compareTo(today)

也没有工作...... 我也试着在没有joda-time的情况下做到这一点,因为我遇到了麻烦,因为我试图用日期和时间来做...

我发现的其他事情既冗长又复杂,我想也许有更好的方法,没有joda-time。

修改

我刚试过这个:

  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 个答案:

答案 0 :(得分:0)

你可以使用这样的东西:

    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);

答案 1 :(得分:0)

java.time

由于您可以使用 java.time 中的 LocalDate,现代 Java 日期和时间 API,我强烈建议您坚持使用 java.time。当您知道如何计算差异时,计算将变得简单明了:

    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 开始的月份(有些日期选择器疯狂地使用 0 表示 1 月到 11 日表示 12 月),请记住在将月份数字加 1,然后再将其传递给 LocalDate

您的所有尝试中出了什么问题?

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

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

在您多次尝试中使用的 Calendar 类设计不佳且早已过时。用它正确计算天数真的很麻烦,所以难怪你的尝试给出了错误的结果。

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

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

此外,您说有效的代码片段中的这一行绝对是错误的:

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

您正在使用 LocalDate 中从 1 开始的月份数,例如 4 表示四月,作为 Calendar 中从 0 开始的月份数,例如 4 表示五月。因此,您的 Calendar 已关闭 1 个月。由于我没有您的完整代码,在某些情况下可能会被另一个错误平衡,导致另一个 Calendar 也有 1 个月的时间,我不知道。由于月份的长度不同,您有时仍会收到长达 3 天的错误。