java - Scala - 从数据集中收集不同值时,java.sql.Date 解析不正确

标签 java scala date apache-spark

我正在解析 Dataset[Transaction] 对象中的日期,以便收集一组明确的值:

val distinctTransactionDates: Set[Date] = transactions.map(t => t.transaction_date).distinct().collect().toSet

但日期解析不正确,例如,如果交易的日期为 2019-03-31,则返回值为 2019-04-01。当我登录查看 t.transaction_date.getTime 时,它是 1553990400000(GMT:2019 年 3 月 31 日星期日,0:00:00)。但某些日期与 getTime 的差距超过一天。

这里的日期是一个java.sql.Date

在这种情况下,我无法弄清楚如何正确解析日期,以便在不进行任何更正的情况下获得不同的值。对于上面的示例,我期望得到 2019-03-31

最佳答案

您正在尝试从日期与时间源中提取仅日期值,但未能考虑时区。

另一个问题:您正在使用可怕的 java.sql.Date 类,该类多年前已被现代 java.time 类取代。具体来说,LocalDate

您的日期与时间源可以称为时刻,即时间线上的特定点。对于任何给定时刻,一天中的时间和日期都因全局时区而异。巴黎的中午不是蒙特利尔的中午。新的一天在东方比在西方黎明得更早。您必须非常清楚这一点才能进行正确的日期时间处理。通过人类创造的时区概念,可以通过多种方式来看待自然界的某一时刻。

首先通过 JDBC 将您的时刻提取为 OffsetDateTime 对象。

此处显示的代码采用 Java 语法而不是 Scala。另请注意,java.time 使用不可变对象(immutable对象)。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

调整到您想要感知日期的时区。

ZoneId z = ZoneId( "Asia/Tokyo" ) ;
ZonedDateTime zdt = odt.withZoneSameInstant( z ) ;

提取仅包含日期的部分。

LocalDate ld = zdt.toLocalDate() ;

关于java - Scala - 从数据集中收集不同值时,java.sql.Date 解析不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57137046/

相关文章:

java - 正则表达式 - 指定字符串中重复字符值的数量

scala - scala.util.Random.shuffle 的类型是什么?

Scala 不从资源文件夹中读取文件

java - 如何验证序数日期?

ios - 如何在swift 3中将日期添加到日期

java - 如何刷新 Java 小程序?

java - 摆脱 "The value for annotation attribute must be a constant expression"消息

java - Jackson ObjectMapper 添加反序列化 List<Object> 并注册模块覆盖旧的

scala - 为什么我们需要 scala 中的特征?

php - 选择 TimeDate = now() =< 2 年后的记录