我正在使用 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/