json - POSTMAN 正在返回值已更改的日期字段

标签 json oracle java-8 timezone postman

我正在使用 REST 服务,但收到的 JSON 的日期属性与我的数据库中的内容不匹配。我有两个名为“initialDate”和“finalDate”的字段。在数据库中它们是这样的:

07/MAR/19 00:00:00
07/SEP/19 23:59:59

数据库时区:

select dbtimezone from dual;
+00:00

在我的对象中,Java 类内部,属性的内容如下:

public class Klass {

 @NotNull
 private Date initialDate; //initialDate.toString() "Thu Mar 07 00:00:00 CLT 2019"

 @NotNull
 private Date finalDate; // finalDate.toString() "Sat Sep 07 23:59:59:9 CLT 2019"

 public Date initialDate() {
    return this.initialDate == null ? null : new Date(initialDate.getTime());
 }

 public void setInitialDate() {
     this.initialDate = initialDate == null ? null : new Date(initialDate.getTime());
 }

 public Date finalDate() {
    return this.finalDate == null ? null : new Date(finalDate.getTime());
 }

 public void setFinalDate() {
    this.finalDate = finalDate == null ? null : new Date(finalDate.getTime());
 }

}

但是,在我的 postman 中,它返回以下内容:

initialDate: "2019-03-07T03:00:00Z",
finalDate: "2019-09-08T02:59:59Z"

为什么 POSTMAN 将这 3 小时添加到我的服务响应中?我已经尝试更改 Windows 的时区,但没有任何区别。

最佳答案

Postman 不会向服务器的 JSON 响应添加任何内容。给定日期的这种表示是由服务器生成的,并且存在问题。首先,我们应该从你不应该使用java.util.Date开始,因为你使用Java8。有 java.time 包可用,您应该使用它来表示时间。

Date 类中的

toString 方法使用默认系统时区来打印日期,您不应使用它。 java.time.LocalDateTime 应该适合你。

您的后端服务可能使用一些库来生成 JSON 响应。例如, jackson 。它的配置可能是错误的,这就是您看到错误日期的原因。参见下面的代码:

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.TimeZone;

public class JsonTimeApp {
    public static void main(String[] args) throws IOException {
        LocalDateTime initialDate = LocalDateTime.of(2019, 3, 7, 0, 0, 0);
        LocalDateTime finalDate = LocalDateTime.of(2019, 9, 7, 23, 59, 59);

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.registerModule(new JavaTimeModule());
        mapper.setTimeZone(TimeZone.getTimeZone("GMT"));
        // or mapper.setTimeZone(TimeZone.getTimeZone("Etc/GMT-3"));

        mapper.writeValue(System.out, new Period(initialDate, Date.from(finalDate.toInstant(ZoneOffset.UTC))));
    }
}

@Data
@AllArgsConstructor
@ToString
class Period {

    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private LocalDateTime initialDate;

    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private Date finalDate;
}

以上时区设置为 GMT 的代码打印:

{
  "initialDate" : "2019-03-07T00:00:00",
  "finalDate" : "2019-09-07T23:59:59"
}

但是当我们将时区更改为 Etc/GMT-3 时,它会打印:

{
  "initialDate" : "2019-03-07T00:00:00",
  "finalDate" : "2019-09-08T02:59:59"
}

您应该检查在您的情况下用于生成 JSON 的内容并正确配置时区。请注意,对于 initialDate,我们没有看到此行为,因为我们使用 java.time.LocalDateTime 类而不是 Date

关于json - POSTMAN 正在返回值已更改的日期字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63624760/

相关文章:

javascript - 循环 JSON 对象返回某些元素的未定义

c# - 如何在 Oracle 的连接字符串中设置初始目录?

Java 8 Comparator nullsFirst naturalOrder 混淆

oracle - SQLplus解码执行脚本

java - 使用 java 8 Streams 从 DTO 中的数组列表中删除元素

lambda - 我可以在 reduce 操作中对 lambda 表达式设置条件吗?

javascript - AngularJS 中的日期 json 对象 json

javascript - 我一直在尝试使用 Node js 访问 json 文件中的数据,但输出未定义

javascript - 从 SQL 行访问键

sql - 什么是存储过程,在什么意义上与简单存储过程不同?