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)
我正在使用 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)