Java 日期格式和 JSON - 调试器中的对象显示不同于 toString() 的另一种格式

Java Date format and JSON - Object in Debugger shows another format than toString()

我在使用 DATE 格式并通过 REST-Webservice (JSON) 发送它(作为名为 thesisDTO 的实体的属性)时遇到问题。

我想调用一个 Web 服务方法(POST-请求),其中 DATE 除外,格式如下:

{   ...
"proposalDate":"Feb 17, 2022 7:50:09 AM" }

如果我使用以下代码创建 DATE 变量,方法“toString()”会给出正确的格式:

Date currentDate = new Date();
IsyMNDLogger.getLogger().info("Date To String: "+currentDate.toString());

但是如果我将 currentDate 添加到我的对象 thesisDTO 中:

thesisDTO.setProposalDate(currentDate);

使用调试器,我可以看到格式已更改为:“Wed Feb 16 10:49:28 CET 2022”,但我的网络服务请求无法读取它。

thesisDTO 转换为 JSON 并发送我使用以下代码 (javax.ws.rs) 执行的请求:

Client restclient = ClientBuilder.newClient();
WebTarget target = restclient.target(url);
String response = target.request(MediaType.APPLICATION_JSON)
                .accept(MediaType.TEXT_PLAIN_TYPE)
                .post(Entity.json(thesisWebServiceDTO), String.class);

有谁知道为什么格式不同以及我该如何更改它?我不能使用 SimpleDateFormatter 来更改,因为那只是为了显示我认为的另一种格式。

非常感谢, 妮可

首先,调试器以其配置的任何格式显示日期,与您如何格式化日期无关。 Date 在内部存储为 long 值,它包含自 1970 年 1 月 1 日午夜以来的毫秒数,并且它不包含任何格式信息。如果您将日期格式化为字符串并在调试器中查看它,那么您将完全按照格式化日期的方式看到它。现在,对于你的问题,首先请停止使用 class Date 甚至 SimpleDateFormat 它们肯定已经过时了(双关语意)。请查看 java.time 包,您应该使用的 class 是 DateTimeFormatter and TemporalAccessor interrface implementations such as ZonedDateTime, OffsetDateTime LocalDateTime 或任何其他可能满足您需要的包。至于 DTO 中的日期字段,请像这样注释它:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
ZonedDateTime proposalDate;

有关详细信息,请查看此问题的最佳答案: