我創建了一個簡單的模型類User。我在這里使用了 Util 日期。
class User{
private int id;
private String name;
private Date createdAt;
}
在用戶發布 API 呼叫時,我只是執行setCreatedAt(new Date).
問題出在回應中,我將 createdAt 設為實際時間的 -5.30。不會呼叫額外的時間轉換方法。
例如,我點擊了創建的 POST API 用戶28-10-2021 11:30:00,我可以在日志中看到該用戶。但是當它向郵遞員回傳回應時,它顯示了28-10-2021 06:00:00時間。代碼中沒有時間轉換方法。我在除錯模式下檢查了 return 陳述句中的 return 物件,即使有顯示28-10-2021 11:30:00.
- 我想知道這種轉換發生在哪里。以及如何阻止這種情況。
- 如果是日期時間庫的問題,那么我應該使用哪個。
Extra information:
* My system timezone is in UTC.
* I am using ubuntu.
* Creating restFull APIs(JaxRs)
編輯 1:
客戶端和服務器在同一臺機器上(UTC 時區)。對于客戶,我正在使用 Postman。
URL: [POST] /user
請求正文:
{
"name": "XYZ"
}
實際反應:
{
"id": 1,
"name": "XYZ",
"createdAt: "28-10-2021 06:00:00"
}
預期回應:
{
"id": 1,
"name": "XYZ",
"createdAt: "28-10-2021 11:30:00"
}
uj5u.com熱心網友回復:
在用戶發布 API 呼叫時,我只是執行 setCreatedAt(new Date)。
在創建 java.util.Date 的實體時,您似乎沒有設定時區
默認情況下,無論您的系統時區如何,它都會設定為 UTC。您可以改用https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html。
final TIMEZONE = ""; // need to set the timezone here
SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss", Locale.ENGLISH);
formatter.setTimeZone(TimeZone.getTimeZone(TIMEZONE));
String dateInString = "28-10-2021 11:30:00";
Date date = formatter.parse(dateInString);
uj5u.com熱心網友回復:
可能存在具有時區問題的 JsonFormat 注釋。請查看鏈接以獲取有關該問題的更多詳細資訊。jackson-data-bind問題 覆寫 ObjectMapper 中的時區也不起作用。您可以通過實作自定義日期反序列化器來參考解決的示例,如下所示:
@Component
public class CustomDateDeserializer extends StdDeserializer<Date> {
private static final long serialVersionUID = 1L;
private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); // specify your specific timezone
public CustomDateDeserializer() {
this(null);
}
public CustomDateDeserializer(Class<?> vc) {
super(vc);
}
@Override
public Date deserialize(JsonParser jsonparser, DeserializationContext context)
throws IOException, JsonProcessingException {
String date = jsonparser.getText();
try {
return formatter.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
此外,在 bean 屬性中的 setter 方法上添加反序列化器。
@JsonDeserialize(using = CustomDateDeserializer.class)
public void setReturnDateTime(Date returnDateTime) {
this.returnDateTime = returnDateTime;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341004.html
