java - 获取不同时区的相同日期

标签 java date timezone localdate zoneddatetime

我有一个纪元秒的时间。 从该纪元时间创建了一个日期对象。

日期 date = new Date(epochMilli);

假设日期是“2019 年 11 月 23 日 00:00:00”

现在,我只想在不同时区获得相同的日期,例如:]

日本时间:2019年11月23日00:00:00

美国时间:2019年11月23日00:00:00

我目前使用的是 LocalDateTimeZonedDateTime

但是当我转换到不同的区域时,时间也会改变。但我不想改变这个时间。

提前致谢。

最佳答案

不幸的是,您没有向我们展示如何使用ZonedDateTime,因此以下示例通过展示如何解析毫秒、将从一个区域到其他区域的结果日期时间以及如何使用不同区域解析日期时间:

public static void main(String[] args) {

    long epochMillis = 1574208000000L;
    
    // define a formatter to be used
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MMM yyyy HH:mm:ss",
                                                        Locale.ENGLISH);

    // create an instant from the milliseconds
    Instant instant = Instant.ofEpochMilli(epochMillis);
    // and create some example time zones for later use
    ZoneId utc = ZoneId.of("UTC");
    ZoneId tokyo = ZoneId.of("Asia/Tokyo");
    ZoneId losAngeles = ZoneId.of("America/Los_Angeles");
    ZoneId chicago = ZoneId.of("America/Chicago");
    
    /*
     * Part 1: Getting the date time converted to different time zones
     */
    
    // use the instant to create a ZonedDateTime at a specific time zone, here: UTC
    ZonedDateTime utcZdt = instant.atZone(utc);

    // then take the UTC-ZonedDateTime as base for conversion to other time zones 
    ZonedDateTime asiaTokyoConvertedfromUtc = utcZdt.withZoneSameInstant(tokyo);
    ZonedDateTime americaLosAngelesConvertedfromUtc = utcZdt.withZoneSameInstant(losAngeles);
    ZonedDateTime americaChicagoConvertedfromUtc = utcZdt.withZoneSameInstant(chicago);

    // print the results
    System.out.println("#### 1574208000000L at UTC, converted to other zones ####");
    System.out.println("UTC time zone:\t\t\t\t" + utcZdt.format(dtf));
    System.out.println("JST (Japan/Tokyo) time zone:\t\t"
                        + asiaTokyoConvertedfromUtc.format(dtf));
    System.out.println("PST (USA/Los Angeles) time zone:\t"
                        + americaLosAngelesConvertedfromUtc.format(dtf));
    System.out.println("CST (USA/Chicago) time zone:\t\t"
                        + americaChicagoConvertedfromUtc.format(dtf));
    
    System.out.println();

    /*
     * Part 2: Getting the date time in different time zones
     */
    
    // use the instant to create a ZonedDateTime at Asia/Tokyo
    ZonedDateTime asiaTokyoFromMillis = instant.atZone(tokyo);

    // use the instant to create a ZonedDateTime at America/Los Angeles
    ZonedDateTime americaLosAngelesFromMillis = instant.atZone(losAngeles);

    // use the instant to create a ZonedDateTime at America/Chicago
    ZonedDateTime americaChicagoFromMillis = instant.atZone(chicago);

    // print the (expected) results, same as converted date times...
    System.out.println("#### 1574208000000L at different zones ####");
    System.out.println("UTC time zone:\t\t\t\t" + utcZdt.format(dtf));
    System.out.println("JST (Asia/Tokyo) time zone:\t\t"
                        + asiaTokyoFromMillis.format(dtf));
    System.out.println("PST (USA/Los Angeles) time zone:\t"
                        + americaLosAngelesFromMillis.format(dtf));
    System.out.println("CST (USA/Chicago) time zone:\t\t"
                        + americaChicagoFromMillis.format(dtf));
    
    System.out.println();
    
    /*
     * Part 3: How to parse the date time instead of millis
     */
    
    // provide a parseable date time String
    String dateTime = "23 Nov 2019 00:00:00";
    
    // parse it in each desired time zone
    ZonedDateTime utc23Nov2019 = LocalDateTime.parse(dateTime, dtf).atZone(utc);
    ZonedDateTime asiaTokyo23Nov2019 = LocalDateTime.parse(dateTime, dtf)
                                                    .atZone(tokyo);
    ZonedDateTime americaChicago23Nov2019 = LocalDateTime.parse(dateTime, dtf)
                                                         .atZone(losAngeles);
    ZonedDateTime americaLosAngeles23Nov2019 = LocalDateTime.parse(dateTime, dtf)
                                                            .atZone(chicago);

    // print the results, now you have the 23. Nov 2019 at 00:00:00 at each time zone
    System.out.println("#### \"23 Nov 2019 00:00:00\" at different zones ####");
    System.out.println("UTC time zone:\t\t\t\t" + utc23Nov2019.format(dtf));
    System.out.println("JST (Asia/Tokyo) time zone:\t\t"
                        + asiaTokyo23Nov2019.format(dtf));
    System.out.println("PST (USA/Los Angeles) time zone:\t"
                        + americaChicago23Nov2019.format(dtf));
    System.out.println("CST (USA/Chicago) time zone:\t\t"
                        + americaLosAngeles23Nov2019.format(dtf));
}

其输出为

#### 1574208000000L at UTC, converted to other zones ####
UTC time zone:                      20 Nov 2019 00:00:00
JST (Japan/Tokyo) time zone:        20 Nov 2019 09:00:00
PST (USA/Los Angeles) time zone:    19 Nov 2019 16:00:00
CST (USA/Chicago) time zone:        19 Nov 2019 18:00:00

#### 1574208000000L at different zones ####
UTC time zone:                      20 Nov 2019 00:00:00
JST (Asia/Tokyo) time zone:         20 Nov 2019 09:00:00
PST (USA/Los Angeles) time zone:    19 Nov 2019 16:00:00
CST (USA/Chicago) time zone:        19 Nov 2019 18:00:00

#### "23 Nov 2019 00:00:00" at different zones ####
UTC time zone:                      23 Nov 2019 00:00:00
JST (Asia/Tokyo) time zone:         23 Nov 2019 00:00:00
PST (USA/Los Angeles) time zone:    23 Nov 2019 00:00:00
CST (USA/Chicago) time zone:        23 Nov 2019 00:00:00

关于java - 获取不同时区的相同日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58971565/

相关文章:

java - 当我在 main 方法中没有使用 setter 时,为什么会出现 NullPointerException?

excel - 使用公式从excel上的2列中提取和合并非重复数据

java - 将时间/日期时间/数据转换为 java.util.Calendar?

datetime - 我的 xpages 上仅在午夜为用户调整日期

java - 从 JTreeTable SwingX 错误中删除选定的节点

java - Hibernate 不想加载 Oracle 驱动程序

java - 在运行时从配置文件创建和扩展 JPA 实体类

javascript new Date(0) 类显示 16 小时?

php - 为什么这个 usort 没有对日期数组进行排序?

javascript - 使用 date-fns 将日期解析为 UTC 的正确方法