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;
有关详细信息,请查看此问题的最佳答案:
我在使用 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;
有关详细信息,请查看此问题的最佳答案: