首页 > 解决方案 > 如何在不知道时区但使用时钟的情况下将 LocalDateTime 转换回 Instant?

问题描述

可以LocalDateTimeClock. 在进行一些操作后,例如添加时间单位,我想将其转换为Instant. 但它需要时区。如何得到它?

Clock clock = Clock.fixed(...);
LocalDateTime localDateTime = LocalDateTime.now(clock);
localDateTime = localDateTime.plusMinutes(60);
return localDateTime.toInstant(clock.getZone().getRules().getOffeset(...I need instant I don't have yet!...)

标签: javadatetimedate-arithmetic

解决方案


您可以将区域偏移量传递ZoneOffset.UTCtoInstant. 或者,您可以创建一个ZonedDateTimeusingLocalDateTime#atZone并将其转换为Instant.

import java.time.Clock;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;

public class Main {
    public static void main(String[] args) {
        Clock clock = Clock.systemUTC();

        LocalDateTime localDateTime = LocalDateTime.now(clock);
        localDateTime = localDateTime.plusMinutes(60);

        // UTC
        Instant instant = localDateTime.toInstant(ZoneOffset.UTC);
        System.out.println(instant);

        // A custom zone offset
        instant = localDateTime.toInstant(ZoneOffset.of("+02:00"));
        System.out.println(instant);

        // Your JVM's default timezone
        instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
        System.out.println(instant);

        // A specific timezone
        instant = localDateTime.atZone(ZoneId.of("Africa/Ceuta")).toInstant();
        System.out.println(instant);
    }
}

输出:

2021-03-10T14:30:35.294134Z
2021-03-10T12:30:35.294134Z
2021-03-10T14:30:35.294134Z
2021-03-10T13:30:35.294134Z

从Trail: Date Time了解有关现代日期时间 API 的更多信息。


推荐阅读