POSTMAN is returning date fields with changed values

為{幸葍}努か 提交于 2021-01-28 04:21:01

问题


I am consuming a REST service and I am receiving a JSON with date attributes that do not match what is in my database. I have two fields called "initialDate" and "finalDate". In the database they are like this:

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

The database timezone:

select dbtimezone from dual;
+00:00

In my object, inside the Java class, the content of the attributes comes as:

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());
 }

}

However, in my POSTMAN, it returns this:

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

Why is POSTMAN adding these 3 hours to my service response? I already try to change the timezone of Windows, but there's no difference.


回答1:


Postman does not add anything to JSON response from a server. This representation of given date was generated by server and there is a problem. Firstly, we should start from that you should not use java.util.Date since you use Java8. There is java.time package available and you should use it to represent a time.

toString method from Date class uses default system's time zone to print date and you should not use it. java.time.LocalDateTime should work for you.

Probably your backend service uses some libraries to generate JSON response. For example, Jackson. It's configuration could be wrong this is why you see wrong dates. See below code:

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;
}

Above code with time zone set to GMT prints:

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

But when we change time zone to Etc/GMT-3, it prints:

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

You should check what is used to generate JSON in your case and configure properly time zone. Notice, that for initialDate we do not see this behaviour since we used java.time.LocalDateTime class instead of Date.




回答2:


After some research, I've found this article that send me to a solution.

Date format Mapping to JSON Jackson

According by the write-up, In my custom class, I set the following attributes:

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

In this ways, I get the result as I'd like:

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


来源:https://stackoverflow.com/questions/63624760/postman-is-returning-date-fields-with-changed-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!