我正在开发 2 个在它们之间进行通信的 Spring Boot 项目(第一个项目调用在第二个项目上定义的 POST API 并向其发送 JSON 格式的 DTO 对象。目前这两个项目都在同一台机器上运行,因此它们应该有相同的时区(我想......)
我在正确发送日期格式时遇到问题。我将尝试解释我在做什么以及我面临什么问题。
在第一个项目中,我有这个DTO对象:
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonPropertyOrder(alphabetic=true)
public class OneRowReadTrain1DTO {
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = JsonFormat.DEFAULT_TIMEZONE)
@JsonProperty("Time_Stamp")
private Date timeStamp;
private Double v1;
private Double v2;
........................................
........................................
........................................
CONSTRUCTOR AND GETTER AND SETTER METHODS
}
如您所见,我有这个带有此注释的 timeStamp 字段,用于转换 JSON 中的字段:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = JsonFormat.DEFAULT_TIMEZONE)
它还应该设置默认时区
然后进入第一个项目的一个类,我有这个方法执行对第二个项目中定义的 API 的 POST 请求:
@Scheduled(fixedRate=90000)
public void insertOneRowReadTrain1Job() {
System.out.println("COUNTER: " + counter);
OneRowReadTrain1DTO currentElement = excelRowAsDtoList.get(counter);
System.out.println("CURRENT DTO: " + currentElement);
String insertApiUrl = baseUrl + "oneRowReadTrain1/";
try {
uri = new URI(insertApiUrl);
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ResponseEntity<Integer> result = restTemplate.postForEntity(uri, currentElement, Integer.class);
System.out.println("result: " + result);
System.out.println("--------------------------------------------------------------------------------------------");
counter++;
}
如您所见,我正在通过这一行执行 API 调用:
ResponseEntity<Integer> result = restTemplate.postForEntity(uri, currentElement, Integer.class);
使用调试器timeStamp字段值似乎是正确的,实际上这个字段值是:
OneRowReadTrain1DTO [timeStamp=Sat Oct 17 06:00:14 PDT 2009, v1=6.5718506, v2=538.47812, ......]
如您所见,此日期字段的值为timeStamp=Sat Oct 17 06:00:14,它是预期值。
然后调用第二个项目中定义的 API,在这里我得到了这个字段值的奇怪行为。
在第二个项目中,调用的 API 是:
@PostMapping(value = "/train/{trainName}", consumes = "application/json")
@CrossOrigin(origins = "*", allowedHeaders = "*")
public int insertTrend(@PathVariable("trainName") String trainName,
@RequestBody Map<String, Object> jsonTrainInfo) throws IOException {
int result = 0;
System.out.println("trainName: " + trainName);
System.out.println("JSON: " + jsonTrainInfo);
result = trainService.insertOneRowReadTrain(trainName, jsonTrainInfo);
return result;
}
如您所见,获得的有效负载在此方法参数中:
@RequestBody Map<String, Object> jsonTrainInfo
问题是我得到了这样的东西:
{Time_Stamp=2009-10-17 13:00:14, v1=6.5718506,.....}
如您所见,该字段的值为:Time_Stamp=2009-10-17 13:00:14其中日期部分(2009-10-17)是正确的,但时间部分完全错误,实际上获得的时间部分是13:00:14而不是预期的 06:00:14(存在于已发送对象中的那个)。
现在据我所知 6:00 PDT 等于 13:00 GMT 但为什么我有这个问题?我需要收到的日期在同一时区(或者我错过了什么?)
为什么当它被接收到Map<String, Object> jsonTrainInfo时区似乎改变了?
怎么了?我错过了什么?我该如何尝试解决此问题?我快疯了