SimpleDateFormat
es feo y (más inquietante) no es seguro para subprocesos. Si intenta utilizar simultáneamente la misma instancia en 2 o más hilos, entonces espere que las cosas exploten de la manera más desagradable.
JodaTime es mucho mejor:
import org.joda.time.format._
val fmt = DateTimeFormat forPattern "dd/MM/yyyy"
val input = "12/05/2009"
val output = fmt parseDateTime input
Si se lanza una IllegalArgumentException
, entonces la fecha no era válida.
Como sospecho que querrá saber la fecha real si fuera válida, puede devolver un Option[DateTime]
, con None
si no fuera válido.
def parseDate(input: String) = try {
Some(fmt parseDateTime input)
} catch {
case e: IllegalArgumentException => None
}
otra alternativa es utilizar un Either
para capturar la excepción real, si el formato no era posible:
def parseDate(input: String) = try {
Right(fmt parseDateTime input)
} catch {
case e: IllegalArgumentException => Left(e)
}
ACTUALIZACIÓN
Para utilizar entonces el Either
, tiene dos tácticas principales:
asignar uno de los dos lados:
parseDate(input).left map (_.getMessage)
//will convert the Either[IllegalArgumentException, DateTime]
//to an Either[String, DateTime]
doblarla:
parseDate(input) fold (
_ => S.error(
"birthdate",
"Invalid date. Please enter date in the form dd/mm/yyyy."),
dt => successFunc(dt)
)
Por supuesto, los dos pueden estar compuestos:
parseDate(input).left map (_.getMessage) fold (
errMsg => S.error("birthdate", errMsg), //if failure (Left by convention)
dt => successFunc(dt) //if success (Right by convention)
)
Solo una nota que si se va a utilizar en Lift, es mejor que Box versus Option en términos de un contenedor. Box le permitirá almacenar el error. – andyczerwonka
@arcticpenguin - Personalmente tengo una gran aversión por el constructo 'Box 'de Lift, y los convertiré a' Option's lo antes posible cuando los API lo obliguen a aceptar las cosas. Si también necesito rastrear las excepciones de forma monótona, utilizaré un 'Oither', sobre todo porque puedo asignar fácilmente la excepción a 'String' u otro tipo para el registro o la presentación al usuario final. –
No estoy en absoluto en desacuerdo. Gran punto – andyczerwonka