【问题标题】:Scala: convert java.sql.Date to org.joda.time.DateTimeScala:将 java.sql.Date 转换为 org.joda.time.DateTime
【发布时间】:2019-10-20 18:39:25
【问题描述】:

我在SCALA 工作,我继承了使用org.joda.time.DateTime 对象的代码。如何将我的 java.sql.Date 对象转换为 org.joda.time.DateTime 对象?请注意,我在java 中找到了很多关于如何执行此操作的解释,但我在SCALA 工作

编辑:对我来说是这样的:

val date_String = date.toString
val formatter = org.joda.time.format.DateTimeFormat.forPattern("YYYY-MM-dd")
val date_jodatime = formatter.parseDateTime(date_String)

【问题讨论】:

  • 听起来像是一个简单的代码翻译任务。我不确定我们是否在 Stack Overflow 上提供这样的服务。
  • 您应该几乎可以编写与 Java 相同的东西。请编辑帖子以显示 Java 方式,以便我们无需查找资料即可提供帮助。
  • 因为Java与Scala的关系很近,Java代码通常可以直接翻译成Scala。 Scala(通常)在 JVM 上运行,并且具有内置的 Java 互操作性,这使得它能够直接从 Scala 调用 Java 代码。如果您提供了一个有效的 Java 实现,我可以看看您为什么难以翻译它。
  • 顺便说一句,您打算使用错误的类型。 Joda-Time 中的 DateTime 代表一个时刻,而 java.sql.Date 代表仅代表一个没有时间的日期,也没有与 UTC 或时区的偏移量。此外,Joda-Time 项目现在处于维护模式,它的创建者 Stephen Colebourne 继续创建它的替代品,Java 内置的 java.time 类,在 JSR 310 中定义。Convert using new methods 添加旧班:myJavaSqlDate.toLocalDate()
  • @BasilBourque 感谢您提供的信息。同样,我只是继承了代码,所以我最初没有选择,但我肯定会通知 PO

标签: java scala jodatime date


【解决方案1】:

你可以用 scala 的方式隐式地做到这一点:

//import once, use everywhere
implicit def date2joda(date: java.sql.Date) = ... (put here your java implementation)

val date = new java.sql.Date

//conversion happens implicitly
val dateTime: org.joda.time.DateTime = date

【讨论】:

  • @cchantep 问题是如何在 Scala 中转换它。一种方法是在 Scala 中编写与 Java 相同的逻辑,或者 - 使用 Scala 特性 - 隐式转换就是其中之一(没有说这是最好的方法......)
  • implicit 是一个修饰符,没有什么可以阻止完全的 dame 功能,并且避免误用
【解决方案2】:

您可以使用 DateFormatter。将其转换为字符串,然后将其转换为 JodaTime:

// You have too get the right pattern too ofc, I just put what I used last time
val dateString = yourDatehere.toString
val dtf = DateTimeFormat.forPattern("E MMM dd HH:mm:ss 'CEST' YYYY");
val dateParsed = dtf.parseDateTime(dateString)

此外,Java 解决方案也适用于 Scala。 Scala 构建在 JVM 之上。

【讨论】:

  • 对不起,为什么不能运行 toString 呢?或者你是说模式不匹配?因为我在代码中写道,作为模式必须不同的注释(因为我只是复制粘贴了我使用的东西)。除非 sql.Date 有标准的日期模式(我猜可能有?),否则无论如何您都必须自己弄清楚该模式。不过,关于 LocalDate,我错过了。我对其进行了编辑,因此改为 parseDateTime。但除了那个模式之外,我看不出我的答案有什么问题。你能告诉我吗?
  • 尝试the documentation of java.sql.Date.toString():“以日期转义格式 yyyy-mm-dd 格式化日期。”即使有一个与您的模式匹配的字符串Thu Apr 11 18:26:40 CEST 2019,我仍然得到java.lang.IllegalArgumentException: Invalid format: "Thu Apr 11 18:26:40 CEST 2019",我不知道为什么。
  • 抱歉,我也误会了一点:大写的YYYY 对 Joda-Time 是正确的(java.time,我通常使用的现代 Java 日期和时间 API 不同)。总而言之,格式化为字符串并将其解析回来对我来说仍然感觉像是绕道而行,但是通过您的编辑,我认为您的答案是正确的。
  • 收到这样的回复很奇怪。对我来说,这个对我有用:Thu May 30 10:27:20 CEST 2019 采用这种格式。虽然显然我把它变成了 DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss 'CEST' YYYY")。不过谢谢你的回复。我在生产中使用它没有任何问题,所以有点担心:D
  • 这可能是由于不同的语言环境。如果您想确保您的生产代码始终有效,请明确指定说英语的区域设置(或在您的字符串中使用哪种语言)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 2017-07-13
  • 2013-01-27
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多