web-dev-qa-db-ja.com

土曜日/日曜日かどうかを確認する方法は?

このコードは、今週の月曜日から金曜日までの日付を出力します。それはうまくいきますが、私は何か他のものに聞きたいです:今日が土曜日か日曜日なら、私はそれを来週見せたいです。それ、どうやったら出来るの?

ここに私の作業コードがあります(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);
}

どうもありがとう!何時間も解決策を探してきたので、本当に感謝しています...

26
Cristian
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);

しかし、私は本当に簡単に理解でき、読みやすいものが欲しかった。

25

tl; dr

コアコードの概念:

_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

最新の方法は、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のライブコード を参照してください。

enter image description here


Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacy のような日時クラスに取って代わります- _Java.util.Date_Calendar 、& SimpleDateFormat

Joda-Time プロジェクトは、現在は メンテナンスモード であり、Java.timeへの移行を推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。

Java.timeクラスはどこで入手できますか?

  • Java SE 8 および SE 9 以降
    • ビルトイン。
    • 標準の一部Java実装がバンドルされたAPI。
    • Java 9は、いくつかのマイナーな機能と修正を追加します。
  • Java SE 6 および SE 7
  • Android
    • ThreeTenABP プロジェクトは適応しますThreeTen-Backport(上記)Android具体的に。
    • 使用方法… を参照してください。

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuarter などの便利なクラスがあります。 、および more

17
Basil Bourque