Scala - 将字符串转换为时间戳

Scala - Convert a string to a timestamp

我正在使用 PostgreSQL 和 PlayFramework,我需要将 Option[String] 转换为 Timestamp 以执行我的查询。

我的 Option[String] 是该格式的日期:2016/07/26

时间戳的格式为:2016-07-26

我知道我可以将 to_stimetamp(myDate, 'YYYY-MM-DD') 添加到我的查询中,但我不想使用它(实际上我不知道我以后是否会使用 MySQL 或 PostgreSQL,该函数不会MySQL)

中不存在

那我该怎么办?

 import org.joda.time.DateTime
 import org.joda.time.format.DateTimeFormat
 import scala.util.Try

 object Test extends App {
   val sourceFormat = DateTimeFormat.forPattern("yyyy/MM/dd")
   val targetFormat = DateTimeFormat.forPattern("yyyy-MM-dd")

   def parse(str: String): Option[DateTime] = {
     Try(DateTime.parse(str, sourceFormat)).toOption
   }

   val input = "2015/07/11"
   val maybeDate = parse(input)
   println(maybeDate.map(_.toString(targetFormat)))
   // Some("2015-07-11")
 }

parse方法与预先计算好的DateTimeFormat一起使用也更有效,否则每次都会验证格式。如果您调用 toString,在内部也会尝试从 String 重建 DateTimeFormat,这是低效的。

与其他答案不同,我建议您永远不要使用 DateTime.parse("2016/07/26"),例如不要传递 String 参数,因为没有内部格式缓存。

此外 Option.map 不会捕获 DateTime.parse 可能抛出的错误,因此如果您只使用 Option 它会在运行时爆炸并出现错误,如果字符串不解析,而不是正确返回 None。使用 Try 解决了这个问题。

如果您使用的是 joda DateTime,那么您可以像这样简单地调用解析方法:

DateTime.parse("2016/07/26")

如果字符串包含在 Option 中,那么你可以简单地使用这个:

val d = Option("2016/07/26")
d.map(dt => DateTime.parse(d))

否则,如果您使用的是 java.util.Date,那么您可以像这样使用 SimpleDateFormat:

val f = new java.text.SimpleDateFormat("yyyy-MM-dd")
f.parse("2016/07/26")

这是时间戳文字的隐式转换。

import java.sql.Timestamp
import java.time.Instant

object util {
  implicit class StringTimeConversions(sc: StringContext) {
    def t(args: Any*): Timestamp =
      Timestamp.from(Instant.parse(sc.s(args:_*)))
  }
}

import util._
val time: Timestamp = t"2007-01-01T00:00:00.00Z"

只需使用 Timestamp.valueOf 和 String.replaceAll 来修复斜线。您还需要添加时间(只需将其固定为午夜,或您想要的任何时间):

Timestamp.valueOf("2015/06/08".replaceAll("/", "-") + " 00:00:00")

使用java.time.ZonedDateTime。定义自己的格式并解析时间戳。

首先需要 imports :

import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter

下面的代码将 return 一个 ZonedDateTime 这是一种更通用的格式,可以与 -

一起使用

        val tsFormat = "yyyy-MM-dd'T'HH:mm:ssz"
        val formatter = DateTimeFormatter.ofPattern(tsFormat)
        // sample date 2021-05-07T00:00:00+00:00
        val startTs = ZonedDateTime.parse(dateString, formatter)