我在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
答案 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类通常具有三个重载的变体:
now
参数的参数,我建议将其普遍使用。ZoneId
参数的可测试性很好的参数。 Clock
包含一个时区,因此,它也可以为您提供该指定时区中的当前日期和/或时间。答案 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。