お仕事にてJavaで営業日を求めるプログラムを作成したが、Scalaではどうやるのか疑問に思ってちょっとコーディングしてみた。
以下の例は、仮に2018年3月26日を指定した時の3月の営業日一覧を返してくれる。
package test
import java.util.Date
import org.joda.time._
import org.joda.time.format._
/*
* 指定した年月日の営業日を一覧で出す
*/
object Main extends App {
// 祝日セット
val yearCalendar = Map( 201801 -> List(1,2,3), 201802 -> List(10), 201803 -> List(21), 201804 -> List(30), 201805 -> List(3,4,5))
// 日付
val year = 2018
val month = 3
val day = 26
(1 to day).toList
.map( x => new DateTime(year, month, x, 0 ,0 ,0 ) )
.filter( x => x.dayOfWeek().get == Week.MONDAY.value || x.dayOfWeek().get == Week.TUESDAY.value ||
x.dayOfWeek().get == Week.WEDNESDAY.value || x.dayOfWeek().get == Week.THURSDAY.value ||
x.dayOfWeek().get == Week.FRIDAY.value)
.filterNot(x => yearCalendar.getOrElse( DateTimeFormat.forPattern("yyyyMM").print(x).toInt , List(Int) ).contains(x.getDayOfMonth) )
.foreach( x => println( DateTimeFormat.forPattern("yyyy-MM-dd").print(x) ) )
}
結果は以下の通り。ちゃんととれてるjoda..。
2018-03-01
2018-03-02
2018-03-05
2018-03-06
2018-03-07
2018-03-08
2018-03-09
2018-03-12
2018-03-13
2018-03-14
2018-03-15
2018-03-16
2018-03-19
2018-03-20
2018-03-22
2018-03-23
2018-03-26
DateクラスのEnumがなかったので書いてみた。以下リンクのサイト参考。
trait EnumLike {
type Value
def value: Value
}
trait Enum[T] extends EnumLike {
type Value = T
}
trait EnumCompanion[A <: EnumLike] {
def values: Seq[A]
def valueOf(value: A#Value): Option[A] = values.find(_.value == value)
}
abstract sealed class WeekType(val value: Int) extends Enum[Int]
object Week extends EnumCompanion[WeekType] {
case object MONDAY extends WeekType(1)
case object TUESDAY extends WeekType(2)
case object WEDNESDAY extends WeekType(3)
case object THURSDAY extends WeekType(4)
case object FRIDAY extends WeekType(5)
lazy val values = Seq(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY)
}
参考:
[リンク] https://gist.github.com/gakuzzzz/4ad53153e28b3a6e0aa6