mysql DateTimeException:无法从TemporalAccessor获取ZonedDateTime

xqnpmsa8  于 2023-08-02  发布在  Mysql
关注(0)|答案(1)|浏览(110)

我在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时间,但仍然好奇如何修复标题上的错误

mnemlml8

mnemlml81#

entity.getCreationDate().atZone(ZoneId.of("America/Argentina/Buenos_Aires"))返回一个ZonedDateTime,因此返回错误,因为这样你就试图找到一个ZonedDateTime和一个LocalDateTime之间的差异。改成

long seconds = ChronoUnit.SECONDS.between(entity.getCreationDate(), argDate());

字符串
由于您已经在数据库中存储了LocalDateTime,这将为您提供两个LocalDateTime之间的差异。
如果您仍然希望使用entity.getCreationDate().atZone(ZoneId.of("America/Argentina/Buenos_Aires")),则需要将argDate的定义更改为

public static ZonedDateTime argDate() {
    return ZonedDateTime.now(ZoneId.of("America/Argentina/Buenos_Aires"));
}


这样你就可以找到两个ZonedDateTime之间的区别。

相关问题