我正在使用PostgreSQL和PlayFramework,我需要将Option [String]转换为Timestamp来执行我的查询。
我的选项[String]是该格式的日期:2016/07/26
时间戳的格式为:2016-07-26
我知道我可以将to_stimetamp(myDate, 'YYYY-MM-DD')
添加到我的查询中,但我不想使用它(实际上我不知道我以后是否会使用MySQL或PostgreSQL这个功能不会t存在于MySQL)
那我该怎么办?
答案 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)