【问题标题】:POSTMAN is returning date fields with changed valuesPOSTMAN 正在返回值更改的日期字段
【发布时间】:2020-12-16 20:31:24
【问题描述】:

我正在使用一个 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 的时区,但没有任何区别。

【问题讨论】:

    标签: json oracle java-8 timezone postman


    【解决方案1】:

    经过一番研究,我发现这篇文章可以让我找到解决方案。

    Date format Mapping to JSON Jackson

    根据文章,在我的自定义类中,我设置了以下属性:

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSZ");
    df.setTimeZone(TimeZone.getDefault());
    this.setDateFormat(df)
    

    通过这种方式,我得到了我想要的结果:

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

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

      • 不错的答案!你的回答总能给人一些见解,向你学习很好! :)
      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多