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

时间:2016-07-26 12:58:51

标签: postgresql scala playframework-2.0

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

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

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

我知道我可以将to_stimetamp(myDate, 'YYYY-MM-DD')添加到我的查询中,但我不想使用它(实际上我不知道我以后是否会使用MySQL或PostgreSQL这个功能不会t存在于MySQL)

那我该怎么办?

5 个答案:

答案 0 :(得分:2)

 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,也会尝试再次从DateTimeFormat重建String,这效率很低。

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

更多Option.map没有捕获DateTime.parse可能引发的错误,所以如果你只使用Option它会在运行时爆炸,如果字符串错误不解析,而不是正确返回None。使用Try解决了这个问题。

答案 1 :(得分:0)

如果您使用 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")

答案 2 :(得分:0)

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

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"

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

首先是所需的 imports :

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

下面的代码将返回一个 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)