Как я могу найти самую последнюю дату окончания месяца по времени Joda? - PullRequest
6 голосов
/ 14 июня 2010

Скажем, дата окончания месяца - это дата в месяце, которая является последним выходным и нерабочим днем ​​в этом месяце.Как я могу найти самую последнюю дату окончания прошлого месяца по времени Joda?Например, ответом на сегодня будет пятница, 28 мая, потому что это конец мая, а май - самый последний месяц.

Ответы [ 3 ]

5 голосов
/ 14 июня 2010

DateTime.dayOfMonth.getMaximumValue () указывает последний день месяца.Получите рабочий день этого дня, чтобы проверить, выходной ли он.

3 голосов
/ 14 июня 2010

Вообще говоря:

  • Найти текущий месяц
  • Вернуться на месяц
  • Начать с последнего дня этого месяца:
    • Если это не выходные и не праздничные дни, это дата окончания
    • В противном случае вернитесь на следующий день и повторите

Или, может быть, это:

  • Начните с сегодняшнего дня:
    • Если это не так ...

Это не самый эффективный способ, но его кеширование дешево после его вычисления, поскольку оно будет действовать в течение целого месяца. Вы можете легко вычислить «все» даты окончания месяца и сохранить их в справочной таблице. Вы определенно хотите вычислить, когда будет следующее, потому что именно тогда истекает текущее кэшированное значение.


Пример

Вот фрагмент, который я быстро придумал:

import org.joda.time.*;

public class LastMonthEnd {
   static int count = 0;
   static boolean isWeekendOrHoliday(DateTime d) {
      return (count++ < 5);
   }
   public static void main(String[] args) {
      DateTime d = new DateTime().minusMonths(1).dayOfMonth().withMaximumValue();
      while (isWeekendOrHoliday(d)) {
         d = d.minusDays(1);
      }
      System.out.println(d);
   }
}

Сегодня (2010-06-14 12:04:57Z) печатается "2010-05-26T12:00:42.702Z". Обратите внимание, что isWeekendOrHoliday - просто заглушка для фактической реализации. Я полагаю, что настоящий тест будет довольно сложным (праздничная часть) и может стоить вопроса сам по себе.

0 голосов
/ 10 июня 2014

Исходя из вашего вопроса и комментариев, вы пытаетесь решить проблему следующим образом:

  1. если сегодня рабочий день, вернуть последний рабочий день прошлого месяца
  2. если сегодня не рабочий день, то:
    1. если самый последний рабочий день - последний день месяца, вернуть самый последний рабочий день
    2. возвращаем последний рабочий день прошлого месяца

Вот реализация с библиотекой финансового планирования Lamma (http://lamma.io). Метод Date.backward(Calendar) используется для поиска самого последнего рабочего дня.

Если вы действительно хотите реализовать в Joda, то вам нужно реализовать Date.pastMonthEnd () и Date.backward (Calendar) самостоятельно.

public static void main(String [] args) {
    // print 2014-05-30, because 2014-05-31 is holiday
    System.out.println(findDate(new Date(2014, 5, 31)));

    // print 2014-04-30
    System.out.println(findDate(new Date(2014, 5, 30)));

    // print 2014-04-30, because the most recent working day of 2014-05-25 is not the last working day of May
    System.out.println(findDate(new Date(2014, 5, 25)));
}

private static HolidayRule cal = weekends();   // let's use weekend calendar for now

public static Date findDate(Date current) {
    if (cal.isHoliday(current)) {
        Date lastWorkingDayOfThisMonth = current.lastDayOfMonth().backward(cal);
        Date mostRecentWorkingDay = current.backward(cal);
        if (lastWorkingDayOfThisMonth.equals(mostRecentWorkingDay)) {
            return mostRecentWorkingDay;
        } else {
            return lastWorkingDayOfLastMonth(current);
        }
    } else {
        return lastWorkingDayOfLastMonth(current);
    }
}

public static Date lastWorkingDayOfLastMonth(Date d) {
    return d.lastDayOfPreviousMonth().backward(cal);
}
...