2011-01-09 18 views
20

このコードは、現在の週の日付を月曜日から金曜日まで表示します。それはうまく動作しますが、私は別のことを尋ねたい:今日が土曜日か日曜日かは、それを次の週に見せたい。それ、どうやったら出来るの?土曜日/日曜日の確認方法は?

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

どうもありがとう!私は時間のためのソリューションを探してきたように私は本当にあなたがもしIF/THEN/ELSEを置き換えることができキュートになりたい場合は

答えて

23
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 

...それを感謝します

c.add(Calendar.DATE, dayOfWeek > 5 ? (9 - dayOfWeek) : 1); 

しかし、私は本当に理解しやすく読みやすいものを求めていました。

+0

返信いただきありがとうございます!私はそれを実行する場合、それは週の曜日は2(ここでは日曜日です)と言います。だから、私はそれを月曜日から3日に開始しました。それは正しいのですか? – Cristian

+0

本当にありがとう!!!!! – Cristian

+6

'dayOfWeek == 6'などに優先して、 'dayOfWeek == Calendar.FRIDAY'を使用することがありますか? –

7

TL; DR

コアコードコンセプト:

EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY) 
     .contains( 
      LocalDate.now(ZoneId.of("America/Montreal")) 
        .getDayOfWeek() 
     ) 

java.time

近代的な方法は、java.timeクラスです。

DayOfWeek enumは、月曜日から日曜日の7つのオブジェクトを提供します。

LocalDateクラスは、時間帯のない時間帯のない日付のみの値を表します。

タイムゾーンは、日付を決定する際に重要です。任意の瞬間について、日付は地球の周りでゾーンごとに異なります。たとえば、Paris Franceの真夜中の数分後には、新しい日がありますが、まだ「昨日」はMontréal Québecです。

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 
DayOfWeek dow = today.getDayOfWeek(); 

DayOfWeekオブジェクトのセットとして週末を定義します。 EnumSetは、DayOfWeekなどのオブジェクトを保持するように設計されたSetの特に高速で低メモリの実装です。

Set<DayOfWeek> weekend = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY); 

今は、今日が平日か週末かをテストできます。

Boolean todayIsWeekend = weekend.contains(dow); 

この質問は、週末の場合は来週の開始にジャンプしたいとしています。これを行うには、TemporalAdjusterを使用します。これは、日付/時刻オブジェクトを操作できるクラスを提供します。 java.timeにはimmutable objectsがあります。つまり、元のオブジェクトを変更(「変更」)するのではなく、既存のオブジェクト内の値に基づいて新しいインスタンスを生成します。 TemporalAdjustersクラス(複数の 'に注意してください)には、TemporalAdjusterの便利な実装がいくつか用意されています(next(DayOfWeek)など)。

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); 
} 

live code in IdeOne.comを参照してください。 java.timeについて


java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなど、面倒な古いlegacy日時クラスに取って代わります。

にあるJoda-Timeプロジェクトは、java.timeへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
    • ThreeTenABPプロジェクトはThreeTen-バックポート具体的にAndroidのため(上記)を適応させます。
    • How to use…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題