2017-10-02 20 views
1
public static String getLastWorkingDayOfPreviousMonth() { 

    LocalDate lastDayOfCurrentMonth = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()); 
    LocalDate lastWorkingDayOfMonth; 

    switch (DayOfWeek.of(lastDayOfCurrentMonth.get(ChronoField.DAY_OF_WEEK))) { 
     case SATURDAY: 
      lastWorkingDayOfMonth = lastDayOfCurrentMonth.minusMonths(1); 
      break; 
     case SUNDAY: 
      lastWorkingDayOfMonth = lastDayOfCurrentMonth.minusMonths(2); 
      break; 
     default: 
      lastWorkingDayOfMonth = lastDayOfCurrentMonth; 
    } 

    return getFormattedDate(lastWorkingDayOfMonth); 
} 

上記は、当月の最終営業日です。上記を調整する月の最後の就業日は、どのようにして得ることができますか?LocalDateで前月の最終営業日

+3

'lastWorkingDayOfMonth = lastDayOfCurrentMonth.minusMonths(1);' ???これにより前回の最終日ではなく、前月の最終日になります。代わりに 'minusDays(...)'を使うのですか? – Thomas

+3

前月の最後の就業日:コードが修正されたら、switch文に 'lastDayOfCurrentMonth.minusMonths(1)'を送ってください。 'switch(lastDayOfCurrentMonth.minusMonths(1).getDayOfWeek())'(ステートメントを短縮して可読性を大幅に向上させるメソッド 'getDayOfWeek()'に注意してください)。 – Thomas

+0

ありがとう - どこが間違っているのか分かります。私は 'lastDayOfCurrentMonth.minusMonths(1);を' lastDayOfCurrentMonth.minusDays(1);に更新しました。 – user2781389

答えて

2

時には、単純なアプローチは、巧妙なアプローチよりも優れている:

LocalDate lastWorkingDayOfMonth = LocalDate.now().withDayOfMonth(1); 
do { 
    lastWorkingDayOfMonth = lastWorkingDayOfMonth.minusDays(1); 
} while (lastWorkingDayOfMonth.getDayOfWeek() == DayOfWeek.SATURDAY || 
     lastWorkingDayOfMonth.getDayOfWeek() == DayOfWeek.SUNDAY); 
1

あなたは、次のコードを使用してswitchステートメントを変更することができます。ここでは

public static String getLastWorkingDayOfPreviousMonth() { 

     LocalDate lastDayOfCurrentMonth = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()); 
     LocalDate lastWorkingDayOfMonth; 
     switch (lastDayOfCurrentMonth.minusMonths(1).getDayOfWeek()) { 
      case SATURDAY: 
       lastWorkingDayOfMonth = lastDayOfCurrentMonth.minusMonths(1).minusDays(1); // Here assgining second last day from previous month. 
       break; 
      case SUNDAY: 
       lastWorkingDayOfMonth = lastDayOfCurrentMonth.minusMonths(1).minusDays(2); // Here assgining third last day from previous month. 
       break; 
      default: 
       lastWorkingDayOfMonth = lastDayOfCurrentMonth.minusMonths(1); // Here assgining last day from previous month. 
     } 

     return lastWorkingDayOfMonth.toString(); 
    } 

、この場合には、私は計算しています前月の最終日(週末のメソッドminusMonths()の整数値を変更して前月を変更することができます。週末の場合はそれに応じて営業日が変更されます)。

3

もう1つの方法は、前月の取得にjava.time.YearMonthを使用することです。そして、あなたはこの月の最終日を取得し、それが週末でいた場合、前の金曜日に調整します

LocalDate lastDayPreviousMonth = YearMonth 
    // current year/month 
    .now() 
    // previous month 
    .minusMonths(1) 
    // last day of month 
    .atEndOfMonth(); 
DayOfWeek dayOfWeek = lastDayPreviousMonth.getDayOfWeek(); 
// check if it's weekend 
if (dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY) { 
    // adjust to previous friday 
    lastDayPreviousMonth = lastDayPreviousMonth.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY)); 
} 

このコードを実行して、今日(10月2日ND 2017)を、それがlastDayPreviousMonth2017-09-29に等しくなります。


PS:あなたはいつもあなたが望むように動作文句を言わないminusMonthsLocalDate内のインスタンスを、使用しています。私は2017年2月の日付がある場合の例は、:

// Feb 15th 2017 
LocalDate d = LocalDate.of(2017, 2, 15); 
// adjust to last day of month (2017-02-28) 
d = d.with(TemporalAdjusters.lastDayOfMonth()); 
System.out.println(d.minusMonths(1)); // 2017-01-28 

を2017年2月の最終日は第28 で、minusMonths(1)を呼び出すとき、あなたは前月の同じ日(第28 )を取得します(1月)は、あなたが望むものではありません(2017年1月の最後の就業日は31 stです)。

YearMonthを使用すると、このクラスは日を無視して月と年だけを処理するため(minusMonthsはそのような影響を受けません)、これを避けることができます。だから、希望の月に簡単に行くことができますし、その後、atEndOfMonth()メソッドを使用して、最後の日を正しく取得することができます。

0

あなたは、前の月の最後の日を取得するためにLocalDate.now().minusMonth(1).with(TemporalAdjusters.lastDayOfMonth())にコード内でLocalDate.now().with(TemporalAdjusters.lastDayOfMonth()) を交換し、その後の月の最終営業日を見つけるために、同じロジックを続けることができます。

1

TL; DR

LocalDate.now() 
     .withDayOfMonth(1) 
     .with( 
      org.threeten.extra.Temporals.previousWorkingDay() 
     ) 

previousWorkingDay

ThreeTen-Extraプロジェクトはnext/previous平日(非土曜日/日曜日)を見つけるためのTemporalAdjuster実装を提供します。

前月の最終日が曜日である可能性があります。だから私たちの戦略はの最初の日をこの月に得ることです、最初の前の就業日を得るために戻ってください。

ZoneId z = ZoneId.of("America/Montreal") ; 
LocalDate today = LocalDate.now(z); 
LocalDate firstOfMonth = today.withDayOfMonth(1) ; 
LocalDate lastWorkingDayOfPreviousMonth = firstOfMonth.with(org.threeten.extra.Temporals.previousWorkingDay()) ;