1、ZonedDateTime与LocalDateTime区别
LocalDateTime:这基本上是一个美化的字符串表示日期和时间;它与时区无关,这意味着它不代表时间轴上的任何时间点
Instant:这是自EPOCH以来经过的时间的毫秒表示。这表示时间轴上的特定时刻
ZonedDateTime:这也表示时间轴上的某个时刻,但它表示为带有时区的日期和时间
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
// 创建一个 LocalDateTime 对象,表示 2018 年 10 月 25 日 12:00 PM
LocalDateTime localDateTime = LocalDateTime.of(2018, 10, 25, 12, 0, 0);
// 将 LocalDateTime 转换为 UTC 时区的 ZonedDateTime
ZonedDateTime zonedDateTimeInUTC = localDateTime.atZone(ZoneId.of("UTC"));
// 将 UTC 时区的 ZonedDateTime 转换为 America/New_York 时区的 ZonedDateTime
ZonedDateTime zonedDateTimeInEST = zonedDateTimeInUTC.withZoneSameInstant(ZoneId.of("America/New_York"));
// 输出 LocalDateTime 对象(不包含时区)
System.out.println(localDateTime.toString()); // 输出: 2018-10-25T12:00
// 输出 UTC 时区的 ZonedDateTime 对象
System.out.println(zonedDateTimeInUTC.toString()); // 输出: 2018-10-25T12:00Z[UTC]
// 输出 America/New_York 时区的 ZonedDateTime 对象
System.out.println(zonedDateTimeInEST.toString()); // 输出: 2018-10-25T08:00-04:00[America/New_York]
// 示例 2: 创建一个表示当前日期的 ZonedDateTime 对象,时间为 11:30 AM,时区为 UTC
ZonedDateTime z = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC);
// 输出与 UTC 同一瞬间的 US/Central 时区的时间
System.out.println(z.withZoneSameInstant(ZoneId.of("US/Central")));
}
}
2、转换ZonedDateTime成本地时区时间LocalDateTime
import java.time.LocalDateTime;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
// 将 UTC 时间转换为 Zurich(瑞士)时区的本地时间
// 创建一个 ZonedDateTime 对象,时间为 UTC 时区的 11:30
ZonedDateTime utcZoned = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC);
// 定义瑞士 Zurich 时区的 ZoneId
ZoneId swissZone = ZoneId.of("Europe/Zurich");
// 将 UTC 时间转换为 Zurich 时区的同一时刻
ZonedDateTime swissZoned = utcZoned.withZoneSameInstant(swissZone);
// 将转换后的 Zurich 时区的 ZonedDateTime 对象转换为 LocalDateTime 对象
LocalDateTime swissLocal = swissZoned.toLocalDateTime();
// 输出 Zurich 时区的本地时间
System.out.println("Zurich LocalDateTime: " + swissLocal);
// 将 UTC 时间转换为 US/Central 时区的同一时刻
// 再次创建一个 UTC 时区的 11:30 的 ZonedDateTime 对象
ZonedDateTime z = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC);
// 将 UTC 时间转换为 US/Central 时区的同一时刻,并输出结果
System.out.println("US/Central ZonedDateTime: " + z.withZoneSameInstant(ZoneId.of("US/Central")));
}
}
3、时区可用值
注意:没有全部列出,只是其中一部分。
Asia/Shanghai
Universal
Europe/Zagreb
America/Port_of_Spain
Europe/Helsinki
Asia/Beirut
Asia/Tel_Aviv
Pacific/Bougainville
US/Central
Africa/Sao_Tome
Indian/Chagos
America/Cayenne
Asia/Yakutsk
Pacific/Galapagos
Australia/North
Europe/Paris
Africa/Ndjamena
Pacific/Fiji
America/Rainy_River
Indian/Maldives
Australia/Yancowinna
SystemV/AST4
Asia/Oral
America/Yellowknife
Pacific/Enderbury
America/Juneau
Australia/Victoria
America/Indiana/Vevay
Asia/Tashkent
Asia/Jakarta
Africa/Ceuta
Asia/Barnaul
America/Recife
America/Buenos_Aires
America/Noronha
America/Swift_Current
Australia/Adelaide
America/Metlakatla
Africa/Djibouti
America/Paramaribo
Europe/Simferopol
Europe/Sofia
Africa/Nouakchott
Europe/Prague
America/Indiana/Vincennes
Antarctica/Mawson
America/Kralendijk
Antarctica/Troll
Europe/Samara
Indian/Christmas
America/Antigua
Pacific/Gambier
America/Indianapolis
America/Inuvik
America/Iqaluit
Pacific/Funafuti
UTC
Antarctica/Macquarie
Canada/Pacific
America/Moncton
Africa/Gaborone
Pacific/Chuuk
Asia/Pyongyang
America/St_Vincent
Asia/Gaza
Etc/Universal
PST8PDT
Atlantic/Faeroe
Asia/Qyzylorda
Canada/Newfoundland
America/Kentucky/Louisville
America/Yakutat
Asia/Ho_Chi_Minh
Antarctica/Casey
Europe/Copenhagen
Africa/Asmara
Atlantic/Azores
Europe/Vienna
ROK
Pacific/Pitcairn
America/Mazatlan
Australia/Queensland
Pacific/Nauru
Europe/Tirane
Asia/Kolkata
SystemV/MST7
Australia/Canberra
MET
Australia/Broken_Hill
Europe/Riga
America/Dominica
Africa/Abidjan
America/Mendoza
America/Santarem
Kwajalein
America/Asuncion
Asia/Ulan_Bator
NZ
America/Boise
Australia/Currie
EST5EDT
Pacific/Guam
Pacific/Wake
Atlantic/Bermuda
America/Costa_Rica
America/Dawson
Asia/Chongqing
Eire
Europe/Amsterdam
America/Indiana/Knox
America/North_Dakota/Beulah
Africa/Accra
Atlantic/Faroe
Mexico/BajaNorte
America/Maceio
Etc/UCT
Pacific/Apia