356

如何找到两个Joda-Time DateTime实例之间的天数差异?对于“天数差异”,我的意思是如果开始是在星期一,结束是在星期二,我希望返回值 1,而不管开始日期和结束日期的小时/分钟/秒。

Days.daysBetween(start, end).getDays()如果开始在晚上并在早上结束,则给我 0。

我对其他日期字段也有同样的问题,所以我希望有一种通用的方法来“忽略”不太重要的字段。

换句话说,2 月和 3 月 4 日之间的月份也是 1,14:45 和 15:12 之间的时间也是 1。但是 14:01 和 14:55 之间的小时差将为 0。

4

9 回答 9

416

令人讨厌的是,withTimeAtStartOfDay 的答案是错误的,但只是偶尔。你要:

Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()

事实证明,“午夜/一天的开始”有时意味着凌晨 1 点(在某些地方会以这种方式进行夏令时),而 Days.daysBetween 无法正确处理。

// 5am on the 20th to 1pm on the 21st, October 2013, Brazil
DateTimeZone BRAZIL = DateTimeZone.forID("America/Sao_Paulo");
DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, BRAZIL);
DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, BRAZIL);
System.out.println(daysBetween(start.withTimeAtStartOfDay(),
                               end.withTimeAtStartOfDay()).getDays());
// prints 0
System.out.println(daysBetween(start.toLocalDate(),
                               end.toLocalDate()).getDays());
// prints 1

通过一个LocalDate回避整个问题。

于 2013-07-30T23:22:07.597 回答
195

Days班级

Days类与withTimeAtStartOfDay方法一起使用应该可以:

Days.daysBetween(start.withTimeAtStartOfDay() , end.withTimeAtStartOfDay() ).getDays() 
于 2010-09-27T10:28:51.243 回答
90

你可以使用LocalDate

Days.daysBetween(new LocalDate(start), new LocalDate(end)).getDays() 
于 2010-09-27T10:27:15.627 回答
11
于 2017-08-22T04:23:48.170 回答
2

接受的答案构建了两个LocalDate对象,如果您正在读取大量数据,这将非常昂贵。我用这个:

  public static int getDaysBetween(DateTime earlier, DateTime later)
  {
    return (int) TimeUnit.MILLISECONDS.toDays(later.getMillis()- earlier.getMillis());
  }

通过调用getMillis()您使用已经存在的变量。
MILLISECONDS.toDays()然后,使用简单的算术计算,不创建任何对象。

于 2016-06-21T12:37:31.983 回答
1

java.time.Period

使用java.time.Period类来计算天数

LocalDate由于 Java 8 计算差异使用,LocalDateTime来表示两个日期更直观

    LocalDate now = LocalDate.now();
    LocalDate inputDate = LocalDate.of(2018, 11, 28);

    Period period = Period.between( inputDate, now);
    int diff = period.getDays();
    System.out.println("diff = " + diff);
于 2018-11-28T04:13:30.090 回答
0

(KOTLIN) 对于固定日期和当前日期之间的差异 (Joda)

您可以使用Days.daysBetween(jodaDate1,jodaDate2)

这是一个例子:

        val dateTime: DateTime = DateTime.parse("14/09/2020",
            DateTimeFormat.forPattern("dd/MM/yyyy"))
        val currentDate = DateTime.now()
        //To calculate the days in between
        val dayCount = Days.daysBetween(dateTime,currentDate).days
        //Set Value to TextView 
        binding.daysCount.text = dayCount.toString()
于 2022-01-25T05:09:22.453 回答
-1
DateTime  dt  = new DateTime(laterDate);        

DateTime newDate = dt.minus( new  DateTime ( previousDate ).getMillis());

System.out.println("No of days : " + newDate.getDayOfYear() - 1 );    
于 2018-11-09T14:59:06.413 回答
-11
public static int getDifferenceIndays(long timestamp1, long timestamp2) {
    final int SECONDS = 60;
    final int MINUTES = 60;
    final int HOURS = 24;
    final int MILLIES = 1000;
    long temp;
    if (timestamp1 < timestamp2) {
        temp = timestamp1;
        timestamp1 = timestamp2;
        timestamp2 = temp;
    }
    Calendar startDate = Calendar.getInstance(TimeZone.getDefault());
    Calendar endDate = Calendar.getInstance(TimeZone.getDefault());
    endDate.setTimeInMillis(timestamp1);
    startDate.setTimeInMillis(timestamp2);
    if ((timestamp1 - timestamp2) < 1 * HOURS * MINUTES * SECONDS * MILLIES) {
        int day1 = endDate.get(Calendar.DAY_OF_MONTH);
        int day2 = startDate.get(Calendar.DAY_OF_MONTH);
        if (day1 == day2) {
            return 0;
        } else {
            return 1;
        }
    }
    int diffDays = 0;
    startDate.add(Calendar.DAY_OF_MONTH, diffDays);
    while (startDate.before(endDate)) {
        startDate.add(Calendar.DAY_OF_MONTH, 1);
        diffDays++;
    }
    return diffDays;
}
于 2014-12-24T17:38:04.920 回答