2017-04-21 21 views
0

私はこの問題を数回前に偶然見つけました。周りにはいくつかの答えがありますが、それらは非常に遅いです。2つの日付間の営業日数を計算する最速アルゴリズムですか?

def businessDaysBetween(startDate: DateTime, endDate: DateTime): Seq[DateTime] = { 
    1 to daysBetween(startDate, endDate) map { 
     startDate.withFieldAdded(DurationFieldType.days(), _) 
    } diff holidays filter { 
     _.getDayOfWeek() match { 
     case DateTimeConstants.SUNDAY | DateTimeConstants.SATURDAY => false 
     case _ => true 
     } 
    } 
} 

def daysBetween(startDate: DateTime, endDate: DateTime) = 
    Days.daysBetween(startDate.toDateMidnight(), endDate.toDateMidnight()).getDays() 

私の質問は、2つの日付の間の営業日数を計算する方法だけでなく、できるだけ速い解決方法です。実際の日付ではなく、営業日の数だけを知る必要があることに注意してください。

+0

あなたのユースケースに応じて、あらかじめ計算してそれを見てください(私たちは実際に1社で1年中残りました。私たちはLotus Notesを使用していました。 ) –

+0

一定の時間内に何かできることを事前計算してキャッシュするのはなぜですか? –

+0

あなたのユースケースによりますが、それはより速いかもしれません。特に、実装言語の計算が遅い場合 –

答えて

1

は同じO(C)複雑さと私の意見では少し読みやすくバージョンです。

また、土曜日と次の金曜日の間に5営業日、月曜日と次の金曜日の間に4営業日しかないと考えます。

0

これは私が最速の解決策と考えているのは、startDateが表す曜日を考慮する必要があるだけです。複雑さはO(C)次のとおりです。私は週が月曜日(ジョダのデフォルト)に開始されることを考える

def getPreviousWorkDay(d: DateTime): DateTime = { 
    d.withDayOfWeek(Math.min(d.getDayOfWeek, DateTimeConstants.FRIDAY)).withTimeAtStartOfDay() 
    } 

    def businessDaysBetween(startDate: DateTime, endDate: DateTime): Int = { 
    val workDayStart = getPreviousWorkDay(startDate) 
    val workDayEnd = getPreviousWorkDay(endDate) 

    val daysBetween = Days.daysBetween(workDayStart, workDayEnd).getDays 
    val weekendDaysBetween = daysBetween/7 * 2 
    val additionalWeekend = if(workDayStart.getDayOfWeek > workDayEnd.getDayOfWeek) 2 else 0 

    daysBetween - weekendDaysBetween - additionalWeekend 
    } 

:ここ

def businessDaysBetween(startDate: DateTime, endDate: DateTime): Int = { 
    val numDays = daysBetween(startDate, endDate) 
    val numHolidays: Int = startDate.getDayOfWeek match { 
     case DateTimeConstants.MONDAY => (numDays/7)*2 + (if (numDays % 7 > 4) min(numDays % 7 - 4, 2) else 0) 
     case DateTimeConstants.TUESDAY => (numDays/7)*2 + (if (numDays % 7 > 3) min(numDays % 7 - 3, 2) else 0) 
     case DateTimeConstants.WEDNESDAY => (numDays/7)*2 + (if (numDays % 7 > 2) min(numDays % 7 - 2, 2) else 0) 
     case DateTimeConstants.THURSDAY => (numDays/7)*2 + (if (numDays % 7 > 1) min(numDays % 7 - 1, 2) else 0) 
     case DateTimeConstants.FRIDAY => (numDays/7)*2 + (if (numDays % 7 > 0) min(numDays % 7, 2) else 0) 
     case DateTimeConstants.SATURDAY => 1 + (numDays/7)*2 + (if (numDays % 7 > 0) 1 else 0) 
     case DateTimeConstants.SUNDAY => 1 + (numDays/7)*2 + (if (numDays % 7 > 5) 1 else 0) 
    } 
    numDays - numHolidays 
} 
関連する問題