Скажите, что дата окончания месяца является датой через месяц, который является в прошлые невыходные и непраздничный день в том месяце. Как я могу найти новую дату окончания прошлого месяца со временем Joda? Например, ответ на сегодняшний день был бы пятница 28-го мая, потому что это было концом месяца Мэй, и май был новым месяцем для окончания.
В общем:
Или, может быть, это:
Это не самый эффективный вариант, но дешево кэшировать значение после его вычисления, потому что оно будет действительным в течение целого месяца. Вы можете легко вычислить "все" даты окончания месяца и сохранить их в поисковой таблице. Вы определенно хотите вычислить, когда будет следующее, потому что именно тогда истекает текущее кэшированное значение.
Вот отрывок, который я быстро придумал:
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
- это просто заглушка для фактической реализации. Я полагаю, что настоящий тест будет довольно сложным (праздничная часть), и, возможно, стоит задать вопрос сам по себе.
DateTime.dayOfMonth.getMaximumValue () возвращает последний день месяца. Найдите будний день этого дня, чтобы проверить, не приходится ли он на выходные.