2012-03-07 24 views
0

私はいくつかの問題を扱っています。java calendar - 週末の最後の週(週末なし)

私は過去5日間(1日1つのレコード)から5つのレコードを取得しますが、日が今(週末曜日でなければなりません)データベース

1からいくつかのデータを取得する必要があります)

2))(現在または過去、1日に1つのレコードヶ月から20件のレコードを取得

私は、Javaのカレンダーと戦っているが、それでも私は、日付を取得する方法は考えて、持っていません。

誰かが私を助けることができますか?

+0

はい、あなたのコードでこの質問を編集してください。そうすれば、あなたは直面している問題について正確に答えることができます。 – Jasonw

+0

基本的に、[Javaで現在の日付に営業日を追加するにはどうすればいいですか?](http://stackoverflow.com/q/1534804/642706) –

答えて

2

を開始します。

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

だけでキック動作するはず

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 

See API Doc for more

1

あなたはちょうどあなたがしたい毎日を通じて週パラメータの日を微調整することにより、第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); 
0

TL; DR

myLocalDate.with( 
    org.threeten.extra.Temporals.previousWorkingDay() 
) 

使用して、他の回答になりましレガシーあり、このようなよりCalendarとして面倒古い日時のクラスを使用

java.time、java.timeクラスに取って代わら。

最後の5日間を取得するには、まず「今日」を取得する必要があります。

LocalDate

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

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

は、America/MontrealAfrica/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()); 

ThreeTen-エクストラTemporalAdjusterpreviousWorkingDay()

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.DateCalendar、& SimpleDateFormatなど、面倒な古いlegacy日時クラスに取って代わります。

maintenance modeにある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
    • プロジェクトは、具体的にはAndroid用(上記)ThreeTen-バックポートを適応させます。
    • How to use ThreeTenABP…を参照してください。

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

関連する問題