我正在解析 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/