尽管使用 java 日期库有一些缺点,例如缺乏线程安全性(为什么 Java 的 SimpleDateFormat 不是线程安全的?)和难以使用的 API,但您可以使用隐式使事情变得更容易接受:
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 对象或将其存储在本地线程中以避免线程问题。