我正在學習 Java 並遇到了這個問題。我有一個給定格式的日期字符串。
String dbTime = "01/01/1998 12:30:00";
final String DATE_FORMAT = "MM/dd/yyyy HH:mm:ss";
現在我想初始化/創建一個UTC時區的 Date 對象。為此,我嘗試了以下代碼
SimpleDateFormat sdfAmerica = new SimpleDateFormat(DATE_FORMAT);
TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
sdfAmerica.setTimeZone(utcTimeZone);
String sDateInAmerica = sdfAmerica.format(date); // Convert to String first
Date dateInAmerica = new Date();
try {
dateInAmerica = formatter.parse(sDateInAmerica); // Create a new Date object
} catch (ParseException e) {
e.printStackTrace();
}
這會將時間轉換為 UTC 而不是僅僅創建一個日期對象。
01/02/1998 23:00:00
現在我對轉換時間的正確方法感到困惑。我有字符串格式的時間,我必須將其轉換為不同的格式,主要是 UTC 到 PST 或 PST 到 UTC。
經過一番研究,我找到了本教程,但無法獲得預期的輸出。
java.util.Date 類不是最適合開始的。雖然它從外面看起來像是一個完整的日期,但它實際上只代表一個時間戳,而沒有存儲實際的時區信息。
在 Java 8 及更高版本上,我建議堅持使用設計更好的 java.time.* 類。
String dbTime = "01/01/1998 12:30:00";
String DATE_FORMAT = "MM/dd/yyyy HH:mm:ss";
// parsed date time without timezone information
LocalDateTime localDateTime = LocalDateTime.parse(dbTime, DateTimeFormatter.ofPattern(DATE_FORMAT));
// local date time at your system's default time zone
ZonedDateTime systemZoneDateTime = localDateTime.atZone(ZoneId.systemDefault());
// value converted to other timezone while keeping the point in time
ZonedDateTime utcDateTime = systemZoneDateTime.withZoneSameInstant(ZoneId.of("UTC"));
// timestamp of the original value represented in UTC
Instant utcTimestamp = systemZoneDateTime.toInstant();
System.out.println(utcDateTime);
System.out.println(utcTimestamp);
僅從名稱中就可以看出,對於不同的日期用例有不同的類。
例如 java.time.LocalDateTime 僅表示沒有特定時區上下文的日期和時間,因此可用於直接解析您的字符串值。
要轉換時區,您首先必須轉換為一個 ZonedDateTime,它接受日期、時間和時區。我已經在“systemDefault”上初始化了示例,因為在大多數較小的應用程序中,您可以使用 JVM 和操作系統的默認值來假設當前時區。如果您想確保將該值解釋為太平洋時間,您也可以直接使用 ZoneId.of("America/Los_Angeles") 。
該值可以轉換為另一個時區的另一個 ZonedDateTime,例如 UTC。
對於 UTC,您還可以使用 Instant 類,它僅表示 UTC 時間戳,也可以用作大多數其他類型的基礎
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句