不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2023-04-09 00:30:52  修改时间:2024-04-28 23:55:32  分类:Java基础  编辑

1、ZonedDateTime与LocalDateTime区别

  1. LocalDateTime:这基本上是一个美化的字符串表示日期和时间;它与时区无关,这意味着它不代表时间轴上的任何时间点
  2. Instant:这是自EPOCH以来经过的时间的毫秒表示,即 时间戳。这表示时间轴上的特定时刻(注意:时间戳跟时区没有关系!)
  3. 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);
    }
}