与UTC一起使用localDate

时间:2019-07-08 16:22:55

标签: java timezone utc java-time localdate

我在UTC中使用LocalDate遇到问题。我的服务器使用UTC,而数据库使用UTC。我使用LocalDate为基于订阅的应用程序存储billingDate。

发生的事情是,我们在UTC午夜开票(在进行billingDate <= LocalDate.now()之类的比较时)。实际上,我们的意思是在太平洋标准时间(PST)午夜之后的某个时间计费。

我真的觉得在这里使用LocalDate是合适的,因为我们只想在当天的某个时间计费。但是,直接在代码或数据库中进行比较似乎不切实际(billing_date <= CURRENT_DATE())。我是否犯错了,这应该是PST中的ZonedDateTime吗?还是我们应该转换为ZonedDateTime进行比较?感觉容易出错,我们在进行比较时需要记住要进行转换,但这也许是正确的解决方案?

有人在这种情况下有经验并找到了不错的解决方案吗?

我已经看了这个问题,但是没有回答我的问题:Spring REST LocalDate UTC differs of one day

2 个答案:

答案 0 :(得分:1)

我建议这只是将所需时区传递到$('.start2').on('click', function() { socket.send('dxdd'); }); 的问题。

  • LocalDate.now(ZoneId)用于菲律宾标准时间。目前,它的生成时间为2019-07-09。
  • 使用LocalDate.now(ZoneId.of("Asia/Manila"))作为皮特凯恩标准时间。它刚刚给了2019-07-08。

我假设您的意思不是太平洋标准时间,因为我们所说的时区都没有使用太平洋标准时间(在冬季,现在是太平洋夏令时间)。无论如何,请记住,三个字母的时区缩写通常是不明确的。

具有LocalDate.now(ZoneId.of("Pacific/Pitcairn"))方法的java.time类通常具有三个重载的变体:

  1. 带有一个now参数的参数,我建议将其普遍使用。
  2. 一个带有ZoneId参数的可测试性很好的参数。 Clock包含一个时区,因此,它也可以为您提供该指定时区中的当前日期和/或时间。
  3. 一个不带任何参数并使用JVM的默认时区的人。我建议您不要使用它。读者很高兴知道您已经考虑了时区并选择了所需的时区。而且默认时区可以通过在同一JVM中运行的任何程序随时更改,因此不够稳定,无法依靠它进行实际工作。

答案 1 :(得分:0)

我觉得您应该使用Instant s。

  

我真的觉得在这里使用LocalDate是合适的,因为我们只想在当天的某个时间计费。

嗯,不。您要做会关心计费时间,因为数据库会关心时间。它将计费时间存储为00:00 UTC。由于那是即时的瞬间,因此我认为Instant是这里最合适的选择。您也可以使用ZonedDateTime,但是考虑到您可能已经从数据库中获得了java.sql.Date的{​​{1}},使用toInstant s更为方便

您可以像这样从一年,一月,一天中获取即时信息:

Instant

LocalDate ld = LocalDate.of(2019, 7, 8); Instant i = ld.atStartOfDay(ZoneId.of("America/Los_Angeles")).toInstant(); 是PST。