このコードは、今週の月曜日から金曜日までの日付を出力します。それはうまくいきますが、私は何か他のものに聞きたいです:今日が土曜日か日曜日なら、私はそれを来週見せたいです。それ、どうやったら出来るの?
ここに私の作業コードがあります(StackOverflowに感謝!!):
// Get calendar set to current date and time
Calendar c = Calendar.getInstance();
// Set the calendar to monday of the current week
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
// Print dates of the current week starting on Monday to Friday
DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy");
for (int i = 0; i <= 4; i++) {
System.out.println(df.format(c.getTime()));
c.add(Calendar.DATE, 1);
}
どうもありがとう!何時間も解決策を探してきたので、本当に感謝しています...
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
// Set the calendar to monday of the current week
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
// Print dates of the current week starting on Monday to Friday
DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy");
for (int i = 0; i <= 10; i++) {
System.out.println(df.format(c.getTime()));
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek == Calendar.FRIDAY) { // If it's Friday so skip to Monday
c.add(Calendar.DATE, 3);
} else if (dayOfWeek == Calendar.SATURDAY) { // If it's Saturday skip to Monday
c.add(Calendar.DATE, 2);
} else {
c.add(Calendar.DATE, 1);
}
// As Cute as a ZuZu pet.
//c.add(Calendar.DATE, dayOfWeek > Calendar.THURSDAY ? (9 - dayOfWeek) : 1);
}
}
出力
Mon 03/01/2011
Tue 04/01/2011
Wed 05/01/2011
Thu 06/01/2011
Fri 07/01/2011
Mon 10/01/2011
Tue 11/01/2011
Wed 12/01/2011
Thu 13/01/2011
Fri 14/01/2011
Mon 17/01/2011
キュートになりたい場合は、if/then/elseを
c.add(Calendar.DATE, dayOfWeek > 5 ? (9 - dayOfWeek) : 1);
しかし、私は本当に簡単に理解でき、読みやすいものが欲しかった。
コアコードの概念:
_EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ) // Instantiate a n implementation of `Set` highly optimized in both memory usage and execution speed for collecting enum objects.
.contains( // Ask if our target `DayOfWeek` enum object is in our `Set`.
LocalDate.now( ZoneId.of( "America/Montreal" ) ) // Determine today’s date as seen by the people of a particular region (time zone).
.getDayOfWeek() // Determine the `DayOfWeek` enum constant representing the day-of-week of this date.
)
_
最新の方法は、Java.timeクラスを使用することです。
DayOfWeek
enumは、月曜日から日曜日までの7つのオブジェクトを提供します。
LocalDate
クラスは、時刻とタイムゾーンのない日付のみの値を表します。
タイムゾーンは、日付を決定する上で重要です。どのような場合でも、日付はゾーンごとに世界中で異なります。たとえば、 パリフランス の真夜中から数分後は新しい日ですが、まだ MontréalQuébec の「昨日」です。
_ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DayOfWeek dow = today.getDayOfWeek();
_
週末をDayOfWeek
オブジェクトのセットとして定義します。 EnumSet
は、Set
などのEnum
オブジェクトを保持するように設計されたDayOfWeek
の特に高速で低メモリの実装であることに注意してください。
_Set<DayOfWeek> weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );
_
これで、今日が平日か週末かをテストできます。
_Boolean todayIsWeekend = weekend.contains( dow );
_
質問は、もしこれが週末であれば、来週の初めにジャンプしたいと言いました。これを行うには、日時オブジェクトを操作できるクラスを提供するTemporalAdjuster
を使用します。 Java.timeには、 不変オブジェクト があります。これは、元のオブジェクトを変更(「変更」)するのではなく、既存のオブジェクト内の値に基づいて新しいインスタンスを生成することを意味します。 TemporalAdjusters
クラス(複数形 's'に注意)は、next( DayOfWeek )
を含むTemporalAdjuster
のいくつかの便利な実装を提供します。
_DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY ;
LocalDate startOfWeek = null ;
if( todayIsWeekend ) {
startOfWeek = today.with( TemporalAdjusters.next( firstDayOfWeek ) );
} else {
startOfWeek = today.with( TemporalAdjusters.previousOrSame( firstDayOfWeek ) );
}
_
週末の定義が変更された場合に備えて、週の長さをソフトコーディングします。
_LocalDate ld = startOfWeek ;
int countDaysToPrint = ( DayOfWeek.values().length - weekend.size() );
for( int i = 1 ; i <= countDaysToPrint ; i++ ) {
System.out.println( ld );
// Set up the next loop.
ld = ld.plusDays( 1 );
}
_
IdeOne.comのライブコード を参照してください。
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacy のような日時クラスに取って代わります- _Java.util.Date
_ 、 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクトは、現在は メンテナンスモード であり、Java.timeへの移行を推奨しています。
詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 Interval
、 YearWeek
、 YearQuarter
などの便利なクラスがあります。 、および more 。