我在mysql数据库中有一个datetime列(列名为creation_date),每次我要保存包含该列的实体时,我会像这样填充该列(在我的java类中是LocalDateTime):
public static LocalDateTime argDate() {
return LocalDateTime.now(ZoneId.of("America/Argentina/Buenos_Aires"));
}
字符串
因此,我需要对该日期进行计算,以检查哪些记录具有某些条件,其中之一是当前日期和“creation_date”之间的时间是否等于或高于70秒,对此做些什么,所以我想确保我只使用阿根廷时间以获得准确的结果,没有错误,所以这是可行的:
long seconds = ChronoUnit.SECONDS.between(entity.getCreationDate(), argDate());
型
这个方法有效,但我想100%确定我正在使用Argentina date,所以我尝试了这个方法,但开始在标题中出现错误:
long seconds = ChronoUnit.SECONDS.between(entity.getCreationDate().atZone(ZoneId.of("America/Argentina/Buenos_Aires")), argDate());
型
问题是我现在有很多问题,一个是Mysql的列类型是否总是会给予阿根廷时间的日期时间,因为我总是用ZoneId保存它,我希望是这样...
另一个问题是我如何修复标题上的错误?所以我确保我使用的是阿根廷时间,秒的计算是正确的
到目前为止,我相信我假设Mysql的datetime是阿根廷时间是正确的,因为我决定记录一些条目,这是输出:
LocalDateTime now = argDate();
log.info("database entity creation_date (arg): {}, now (arg): {}", entity.getCreationDate(), now);
型
输出量:
database entity creation_date (arg): 2023-07-20T15:08:25, now (arg): 2023-07-20T15:09:24.013604344
型
但我担心的是,也许这不是真的?而且数据库服务器的时区是阿根廷时间好吗?还是尊重我保存时给它的zoneId
研究:
根据this answer,我不应该担心这种情况,因为它是一个datetime列,它将尊重我在保存它之前给它的zoneId(阿根廷),所以当我从数据库中检索它时,它已经处于Arg时间,但仍然好奇如何修复标题上的错误
1条答案
按热度按时间mnemlml81#
entity.getCreationDate().atZone(ZoneId.of("America/Argentina/Buenos_Aires"))
返回一个ZonedDateTime
,因此返回错误,因为这样你就试图找到一个ZonedDateTime
和一个LocalDateTime
之间的差异。改成字符串
由于您已经在数据库中存储了
LocalDateTime
,这将为您提供两个LocalDateTime
之间的差异。如果您仍然希望使用
entity.getCreationDate().atZone(ZoneId.of("America/Argentina/Buenos_Aires"))
,则需要将argDate
的定义更改为型
这样你就可以找到两个
ZonedDateTime
之间的区别。