最初,SpringFramework WAR 應用程式部署在服務器中,其中 JSON Result 中的日期格式Oct 27, 2021 11:23:48 AM即使在我本地也是如此。
但是相同的應用程式部署到新服務器中,現在結果中的日期格式大不相同Oct 27, 2021, 3:38:02 PM
,在年份之后添加了額外的逗號。
舊服務器是EST時區,現在新服務器是UTC時區。在不改變時區的情況下我應該在代碼級別做什么?
問題是什么?我怎樣才能擁有與舊服務器相同的日期格式?
uj5u.com熱心網友回復:
嘗試使用 ZonedDateTime。
LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("UTC"));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy HH:mm:ss");
String formattedString = zonedDateTime.format(formatter);
uj5u.com熱心網友回復:
問題是什么?
一個java.util.Date物件只是代表時間線上的一個瞬間——一個包裝自 UNIX 時代(1970 年 1 月 1 日,格林威治標準時間 00:00:00)以來的毫秒數。由于它不保存任何Timezone和Locale資訊,它的toString函式應用JVM's TimezoneandLocale以從這個毫秒值派生String的格式回傳a 。要以不同的格式獲得物件的表示,并且,您需要使用所需的格式和適用的,例如EEE MMM dd HH:mm:ss zzz yyyyStringjava.util.DateTimezoneLocaleSimpleDateFormatTimezoneLocale
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
String strDateNewYork = sdf.format(date);
System.out.println(strDateNewYork);
sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
String strDateUtc = sdf.format(date);
System.out.println(strDateUtc);
所以你會看到同一瞬間的不同表示,即
2021 年 10 月 27 日上午 11:23:48 在美國/紐約 = 2021 年 10 月 27 日下午 3:38:02 在 UTC
因為您的服務器默認應用服務器的時區。如果您希望這些值始終在一個 fixed 中Timezone,請如上所示明確指定相同的值。
我怎樣才能擁有與舊服務器相同的日期格式?
如果您希望這些值始終在一個 fixed 中Locale,請如上所示明確指定相同的值。
切換到java.time:
該java.util日期時間API及API格式,SimpleDateFormat都已經過時,而且容易出錯。建議完全停止使用它們并切換到現代 Date-Time API *。
您可以使用java.time.InstantwhotoString方法使用 ISO-8601 表示,因此無論服務器的時區設定如何,輸出都保持不變。
演示:
import java.time.Instant;
public class Main {
public static void main(String[] args) {
Instant now = Instant.now();
System.out.println(now);
}
}
如果你想在不同的時區顯示這個瞬間,你可以ZonedDateTime使用Instant.atZone.
演示:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
Instant now = Instant.now();
System.out.println(now);
ZonedDateTime zdtNewYork = now.atZone(ZoneId.of("America/New_York"));
System.out.println(zdtNewYork);
ZonedDateTime zdtIndia = now.atZone(ZoneId.of("Asia/Kolkata"));
System.out.println(zdtIndia);
}
}
從Trail: Date Time 中了解有關現代日期時間 API 的更多資訊。檢查此答案和此答案以了解如何將java.timeAPI 與 JDBC結合使用。
* 如果您正在為 Android 專案作業并且您的 Android API 級別仍然不符合 Java-8,請檢查通過 desugaring 可用的 Java 8 API。請注意,Android 8.0 Oreo 已提供對java.time.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/345907.html
