1、ZonedDateTime与LocalDateTime区别
- LocalDateTime:这基本上是一个美化的字符串表示日期和时间;它与时区无关,这意味着它不代表时间轴上的任何时间点
- Instant:这是自EPOCH以来经过的时间的毫秒表示,即 时间戳。这表示时间轴上的特定时刻(注意:时间戳跟时区没有关系!)
- ZonedDateTime:这也表示时间轴上的某个时刻,但它表示为带有时区的日期和时间
LocalDateTime localDateTime = LocalDateTime.of(2018, 10, 25, 12, 00, 00); //October 25th at 12:00pm ZonedDateTime zonedDateTimeInUTC = localDateTime.atZone(ZoneId.of("UTC")); ZonedDateTime zonedDateTimeInEST = zonedDateTimeInUTC.withZoneSameInstant(ZoneId.of("America/New_York")); System.out.println(localDateTime.toString()); // 018-10-25T12:00 System.out.println(zonedDateTimeInUTC.toString()); // 2018-10-25T12:00Z[UTC] System.out.println(zonedDateTimeInEST.toString()); // 2018-10-25T08:00-04:00[America/New_York]
2、转换ZonedDateTime成本地时区时间LocalDateTime
//示例1 ZonedDateTime utcZoned = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC); ZoneId swissZone = ZoneId.of("Europe/Zurich"); ZonedDateTime swissZoned = utcZoned.withZoneSameInstant(swissZone); LocalDateTime swissLocal = swissZoned.toLocalDateTime(); //示例2 ZonedDateTime z = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC); System.out.println(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
ZoneDateTime vs LocalDateTime
- LocalDateTime
没有包含时区信息,对象中无法保存时区信息 - ZonedDateTime
包含时区信息,不传的话会使用默认时区(ZoneId.systemDefault()),时区信息会保存到对象中
public class ZoneDateTimeLocalDateTime { public static void main(String[] args) { // 时间戳的概念:格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数 // 时间转为时间戳时首先需要计算到格林威治时间的毫秒数,再去除当前时区到0时区(UTC)的偏移量 LocalDateTime localDateTime = LocalDateTime.of(2021, 9, 14, 11, 13, 0, 0); // 2021-09-14T11:13 System.out.println(localDateTime); // 对应的时间戳转为北京时间为2021-09-14 19:13:00 // 1631617980 System.out.println(localDateTime.toEpochSecond(ZoneOffset.UTC)); // 对应的时间戳转为北京时间为2021-09-14 11:13:00 // 1631589180,会把初始化的时间当作一个8时区的时间转为时间戳 System.out.println(localDateTime.toEpochSecond(ZoneOffset.ofHours(8))); ZonedDateTime zonedDateTime = ZonedDateTime.of(2021, 9, 14, 11, 13, 0, 0, ZoneOffset.UTC); // 2021-09-14T11:13Z System.out.println(zonedDateTime); // 输出 Z:“Z”是协调世界时中0时区的标志 System.out.println(zonedDateTime.getZone()); // 对应的时间戳转为北京时间为2021-09-14 19:13:00 // 1631617980,因为ZonedDateTime本身带有时区,所以toEpochSecond()不能传入时区参数 System.out.println(zonedDateTime.toEpochSecond()); ZonedDateTime zonedDateTime_now = ZonedDateTime.now(ZoneOffset.UTC); // 比当前北京时间少8个小时 System.out.println("zonedDateTime_now: " + zonedDateTime_now); } }