私はいくつかの問題を扱っています。java calendar - 週末の最後の週(週末なし)
私は過去5日間(1日1つのレコード)から5つのレコードを取得しますが、日が今(週末曜日でなければなりません)データベース
1からいくつかのデータを取得する必要があります)
2))(現在または過去、1日に1つのレコードヶ月から20件のレコードを取得
私は、Javaのカレンダーと戦っているが、それでも私は、日付を取得する方法は考えて、持っていません。
誰かが私を助けることができますか?
私はいくつかの問題を扱っています。java calendar - 週末の最後の週(週末なし)
私は過去5日間(1日1つのレコード)から5つのレコードを取得しますが、日が今(週末曜日でなければなりません)データベース
1からいくつかのデータを取得する必要があります)
2))(現在または過去、1日に1つのレコードヶ月から20件のレコードを取得
私は、Javaのカレンダーと戦っているが、それでも私は、日付を取得する方法は考えて、持っていません。
誰かが私を助けることができますか?
を開始します。
private Calendar workingDaysBack(final Calendar from, final int count) {
for (int daysBack = 0; daysBack < count; ++daysBack) {
do {
from.add(Calendar.DAY_OF_YEAR, -1);
} while(isWeekend(from));
}
return from;
}
private boolean isWeekend(Calendar cal) {
return cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY ||
cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY;
}
だけでキック動作するはず
Calendar cal = Calendar.getInstance();//initilized with current date & time
Date date = cal.getTime();//returned the current date & time that cal holds
boolean isMonday = Calendar.MONDAY == cal.get(Calendar.DAY_OF_WEEK);//it will return an integer
あなたはちょうどあなたがしたい毎日を通じて週パラメータの日を微調整することにより、第1の部分を行うことができます検討してください。あなたが週に実行している場合は、現在の週、または最後の完全な週にする必要がありますか?ここでは今週を想定しています...
Calendar cal = Calendar.getInstance();
List<Date> last5Days = new LinkedList<Date>();
List<Integer> weekDays = Arrays.asList(Calendar.MONDAY,
Calendar.TUESDAY, Calendar.WEDNESDAY, Calendar.THURSDAY,
Calendar.FRIDAY);
for (int weekDay : weekDays) {
cal.set(Calendar.DAY_OF_WEEK, weekDay);
last5Days.add(cal.getTime());
}
System.out.println(last5Days);
今月から20週間です。スパン月の境界よりも週に何が望まれるかによって異なります。ここで私は最初の月曜日に行ってからそこから追加します。
List<Date> last20Days = new LinkedList<Date>();
// find first Monday in the month
for (int i = 1; i <= 31; i++) {
cal.set(Calendar.DAY_OF_MONTH, i);
if (cal.get(Calendar.DAY_OF_WEEK) == weekDays.get(0)) {
break;
}
}
for (int i = 1; i <= 31; i++) {
if (last20Days.size() == 20) {
break;
}
if (weekDays.contains(cal.get(Calendar.DAY_OF_WEEK))) {
last20Days.add(cal.getTime());
}
cal.add(Calendar.DAY_OF_MONTH, 1);
}
System.out.println(last20Days);
myLocalDate.with(
org.threeten.extra.Temporals.previousWorkingDay()
)
Calendar
として面倒古い日時のクラスを使用java.time、java.timeクラスに取って代わら。
最後の5日間を取得するには、まず「今日」を取得する必要があります。
LocalDate
LocalDate
クラスは、時間日の時間帯なしなし日付専用の値を表しています。
タイムゾーンは、日付を決定する際に重要です。任意の瞬間について、日付は地球の周りでゾーンごとに異なります。たとえば、Paris Franceの真夜中の数分後には、新しい日がありますが、まだ「昨日」はMontréal Québecです。
は、America/Montreal
、Africa/Casablanca
、又はPacific/Auckland
として、continent/region
の形式でproper time zone nameを指定します。 EST
またはIST
のような3〜4文字の略語は、ではなく、のように、標準化されておらず、ユニークではない(!)と使用しないでください。
ZoneId z = ZoneId.of("America/Montreal");
LocalDate today = LocalDate.now(z);
DayOfWeek
前の日を取得するには、過去の日付を通じて漸進的に移動するminusDays
を呼び出すことができます。
LocalDate yesterday = today.minusDays(1);
LocalDate dayBeforeYesterday = yesterday.minusDays(1);
あなたはDayOfWeek
列挙型を使用することによって、その曜日の各LocalDate
オブジェクトをテストすることができます。そのクラスは7つのオブジェクトを定義しています.1つは各曜日のオブジェクトです。これらは単なる文字列ではなく、実際のオブジェクトであることに注意してください。ここで文字列を使う必要はありません。
Boolean isSaturday = myLocalDate.getDayOfWeek().equals(DayOfWeek.SATURDAY);
Boolean isSunday = myLocalDate.getDayOfWeek().equals(DayOfWeek.SUNDAY);
EnumSet
その比較を行うためのスリッカー、より柔軟な方法はEnumSet
、実行することが非常に高速で、非常に少ないメモリを使用する列挙型用に最適化されたSet
の実装です。
EnumSet<DayOfWeek> weekend = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY);
あなたLocalDate
オブジェクトのDayOfWeek
をテストするためにcontains
を使用してください。
Boolean isWeekend = weekend.contains(myLocalDate.getDayOfWeek());
TemporalAdjuster
previousWorkingDay()
ThreeTen-Extraプロジェクトは、追加機能を持つjava.timeクラスを拡張します。特にここでは、TemporalAdjuster
インターフェイスのpreviousWorkingDay
実装を使用できます。
このアジャスターは、土曜日と日曜日をスキップするようにハードコードされています。他の曜日の値を考慮したい場合は、TemporalAdjuster
という独自の実装を書くことができます。
java.timeクラスは、不変オブジェクトを使用します。したがって、オブジェクトの値(「mutate」)を変更するのではなく、元の値に基づいて値を持つ新しいオブジェクトを生成します。ここではLocalDate::with
と呼び出し、TemporalAdjuster
を渡し、土曜日/日曜日をスキップして前日を表す新鮮なLocalDate
を生成します。
LocalDate previousWorkingDay =
myLocalDate.with(
org.threeten.extra.Temporals.previousWorkingDay()
)
;
それでは、すべて一緒にこれを入れてみましょう。
ZoneId z = ZoneId.of ("America/Montreal");
LocalDate today = LocalDate.now (z);
Integer countDaysPrior = 5;
List<LocalDate> priorWeekdays = new ArrayList<> (countDaysPrior); // Set initial capacity to number of days to be collected.
LocalDate localDate = today; // Initialize to today. Exclusive, we want only prior days.
for (int i = 1 ; i <= countDaysPrior ; i ++) {
localDate = localDate.with (org.threeten.extra.Temporals.previousWorkingDay()); // Decrement each day into the past, skipping over Saturday/Sunday.
priorWeekdays.add (localDate);
}
System.out.println ("Weekdays prior to " + today + " are: " + priorWeekdays);
平日前2017年2月27日である:2017年2月24日、2017年2月23日、2017年2月22日、2017年2月21日、2017年2月20日]
LambdaとStreamsを使用してコードをさらに短くすることができます。 java.timeについて
java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.Date
、Calendar
、& SimpleDateFormat
など、面倒な古いlegacy日時クラスに取って代わります。
maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。
Oracle Tutorialを参照して、詳細をご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。
ここで、java.timeクラスを取得するには?
ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、Interval
、YearWeek
、YearQuarter
、moreなどの便利なクラスがあります。
はい、あなたのコードでこの質問を編集してください。そうすれば、あなたは直面している問題について正確に答えることができます。 – Jasonw
基本的に、[Javaで現在の日付に営業日を追加するにはどうすればいいですか?](http://stackoverflow.com/q/1534804/642706) –