Это мой код, который конвертирует время даты в метку времени эпохи. Лог c - это если время локальное, то делай что-нибудь, иначе делай что-нибудь. Случай успеха работает хорошо
time_to_epoch(List(JString("2000-01-01"), JString("yyyy-MM-dd"))) shouldEqual JString("946684800")
time_to_epoch(List(JString("2013-09-29T18:46:19Z"), JString("yyyy-MM-dd'T'HH:mm:ss'Z'"))) shouldEqual JString("1380480379")
Но случаи отказа не могут получить ожидаемый результат, ошибка "java .time.format.DateTimeParseException: Text '2016-06-21-10-19-22' может не может быть проанализирован по индексу 19 ", почему я не могу получить JNothing? Как устранить эту ошибку?
time_to_epoch(List(JString("2016-06-21-10-19-22"), JString("YYYY-MM-dd-hh-mm-ss a"))) shouldEqual JNothing
def time_to_epoch(params: List[JValue]): JValue = params match {
case _ :: _ :: Nil =>
time_to_epoch(params ::: List(JString("UTC")))
case a :: b :: c :: Nil =>
val jdOpt = for {
JString(timestamp) <- coerce.toString(a)
JString(pattern) <- coerce.toString(b)
formatter = DateTimeFormatter.ofPattern(pattern)
df = formatter.parseBest(timestamp, LocalDateTime.from(_), LocalDate.from(_))
jd1 <- if (df.isInstanceOf[LocalDateTime]) {
val res = df.asInstanceOf[LocalDateTime].toInstant(ZoneOffset.of(String.valueOf(ZoneId.of("UTC").getRules.getOffset(LocalDateTime.now))))
Try(JString(res.getEpochSecond.toString)).toOption
} else {
Try(JString(df.asInstanceOf[LocalDate].atStartOfDay(ZoneId.of("UTC")).toInstant.getEpochSecond.toString)).toOption
}
} yield jd1
jdOpt.getOrElse(JNothing)
case _ => JNothing
}