スレッド セーフの欠如 ( Why is Java's SimpleDateFormat not thread-safe? ) や使いにくい API など、Java 日付ライブラリの使用にはいくつかの欠点がありますが、暗黙を使用して物事をもう少し快適にすることができます。
implicit def stringToDate(date: String) = new {
def parse(implicit format: String) = parse0(date)(format)
private def parse0(date: String)(implicit format: String) = {
val sdf = new SimpleDateFormat(format)
sdf.setLenient(false)
sdf.parse(date)
}
def isValid(implicit format: String) = try { parse0(date)(format); true } catch { case _ => false }
def beforeNow(implicit format: String) = parse0(date)(format) before new Date()
def afterNow(implicit format: String) = parse0(date)(format) after new Date()
}
次に、次のように使用できます。
implicit val format = "yyyy-MM-dd"
"2012-12-02" isValid // true
"2012-12-02" beforeNow // ?
"2012-12-25" afterNow // ?
または、 scala-timeを使用できます:
import org.joda.time.format.ISODateTimeFormat._
import org.joda.time.DateTime
for(date <- date.parseOption("2012-12-02")) yield date < new DateTime // Option(?)
このアプローチにより、Scala に適したインターフェースが得られ、スレッド化の問題を回避するために、新しい SimpleDateFormat オブジェクトを作成して解析したり、スレッド ローカルに格納したりする必要がなくなります。