java - 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
.
解决方案
您正在尝试从日期时间源中提取仅日期值,但未能考虑时区。
另一个问题:您正在使用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() ;
推荐阅读
- javascript - 如何在 Cypress 中直接转换截图 Base64?
- sql - Redshift + Metabase - 如何设置查询队列以串行查询而不是并行查询?
- python - 有没有办法在优化器更新权重之前运行函数?
- python - 为什么我在查找对象 django 的 id 时得到 404
- ubuntu - 播放框架构建在 ubuntu 中不起作用
- rabbitmq - RabbitMQ 无法创建交换,Erlang 错误 {:undef, [{:rabbit_exchange
- javascript - 如何在 Chart.js 中正确显示大量信息而不会过于拥挤
- javascript - momentjs 如何使时区数据保持最新
- spring - 包 org.apache.commons.lang 不存在 - Spring
- reactjs - 反应菜单切换类型错误(gsap,对象不可扩展)