月の終了日は、その月の最後の非週末および非休日の日である月の日付であるとします。ジョダ時間で直近の過去1か月の終了日を見つけるにはどうすればよいですか?たとえば、今日の回答は5月28日金曜日になります。これは、それが5月の月末であり、5月が最後の最後の月であったためです。
3 に答える
DateTime.dayOfMonth.getMaximumValue()は、その月の最後の日を示します。その日の平日を取得して、週末かどうかを確認します。
一般的に言えば:
- 今月を探す
- 1 か月前に戻る
- その月の最終日から開始:
- 週末でも休日でもない場合は、それが終了日です。
- それ以外の場合は、1 日戻って繰り返します
または多分それは:
- 今日から始めましょう:
- どちらでもないなら…
これは最も効率的ではありませんが、1 か月間有効であるため、一度計算した値をキャッシュする方が安上がりです。「すべての」月末日を簡単に計算して、ルックアップ テーブルに格納することもできます。現在のキャッシュされた値が期限切れになるときであるため、次の値がいつになるかを確実に計算する必要があります。
例
これが私がすぐに作り上げたスニペットです:
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
これは、実際の実装の単なるスタブであることに注意してください。実際のテストはかなり複雑になると思いますが (休日の部分)、それ自体で質問する価値があるかもしれません。
あなたの質問とコメントに基づいて、次のような問題を解決しようとしています:
- 今日が営業日の場合は、先月の最終営業日を返します
- 今日が営業日でない場合:
- 最新の営業日がその月の最終日である場合は、最新の営業日を返します
- それ以外は先月の最終営業日を返す
これは、財務スケジューリング ライブラリ 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);
}