首页 > 解决方案 > Scala - 从 DataSet 收集不同的值时,java.sql.Date 解析不正确

问题描述

我正在从 Dataset[Transaction] 对象中解析日期,以收集一组 dictinct 值:

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

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

这里的日期是java.sql.Date

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

标签: javascaladateapache-spark

解决方案


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

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

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

首先通过 JDBC 提取你的时刻作为一个OffsetDateTime对象。

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

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

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

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

提取仅日期部分。

LocalDate ld = zdt.toLocalDate() ;

推荐阅读