java 无法解析“OffsetDateTime”中的方法“withZone”

bbuxkriu  于 2023-02-20  发布在  Java
关注(0)|答案(1)|浏览(135)
    • bounty将于明天过期**。此问题的答案可获得+200声誉奖励。Peter Penzov正在寻找来自声誉良好的来源的答案

我有以下代码,我想迁移到Java 17:
Gradle依赖关系:

implementation 'org.jadira.usertype:usertype.core:7.0.0.CR1'

实体:

import org.joda.time.DateTime;

    @Entity
    @Table(name = "logs")
    public class Log {
    
      @Column(name = "inserted_date")
      @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
      private DateTime insertedDate;
    }

.....

DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("yy-mm-dd'T'HH:mm:ss'Z'");

log.setInsertedDate(DateTime.now());
dateFormatter.print(log.getInsertedDate().withZone(DateTimeZone.UTC)));

我将代码更新为:
实体:

import java.time.OffsetDateTime;

    @Entity
    @Table(name = "logs")
    public class Log {
    
      @Column(name = "inserted_date")
      private OffsetDateTime insertedDate;
    }

.....

DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("yy-mm-dd'T'HH:mm:ss'Z'");

log.setInsertedDate(OffsetDateTime.now());
dateFormatter.print(log.getInsertedDate().withZone(DateTimeZone.UTC)));

但是我得到了错误Cannot resolve method 'withZone' in 'OffsetDateTime'。你知道更新方法withZone的正确方法吗?

编辑:我尝试过

发件人:log.setTimestamp(dateFormatter.print(auditLog.getInsertedDate().withZone(DateTimeZone.UTC)));
至:log.setTimestamp(dateFormatter.print(auditLog.getInsertedDate().atZoneSameInstant(ZoneOffset.UTC)));
对于这行我得到:auditLog.getInsertedDate().atZoneSameInstant(ZoneOffset.UTC)错误:
Cannot resolve method 'print(ZonedDateTime)'
你能建议如何解决这个问题吗?

0yg35tkg

0yg35tkg1#

首先,看起来你的时间格式不是你想要的。
“yy-mm-dd 'T'HH:mm:ss 'Z'”表示打印以下内容的格式:

  • 年-分-日'T'小时(24小时格式):分:秒Z *

例如:23-48-19T14:48:17 Z
我假设你想跟在年和月份后面,那么格式应该是:
“年--日时:分:秒”
例如:23-02-19T14:48:17 Z
要了解有关构造格式化模式的更多信息,请参阅java time api docs中的**“格式化和解析模式”**一节
现在,回到你的问题,
你好像把joda time libraryjava date time api混在一起了,完全用java日期时间API编写,你的代码应该看起来像这样:

import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yy-MM-dd'T'HH:mm:ss'Z'");
log.setInsertedDate(OffsetDateTime.now());
log.setTimestamp(dateFormatter.format(auditLog.getInsertedDate().atZoneSameInstant(ZoneId.of("UTC"))));

PS:我知道在Java中使用日期时间对象会让人沮丧和困惑,特别是因为过去有不止一种方法可以做到这一点。我建议阅读java date time api tutorials以获得更好的理解,并始终使用它(当用java 8+编写时)以避免困惑。

相关问题