如何将 OffsetTime 转换为本地 OffsetTime?

How to convert OffsetTime to local OffsetTime?

为了处理 OffsetTime,我想将其转换为本地 OffsetTime。例如,如果系统默认偏移量为 +1:00.

,则将 14:03:04.708-01:00 转换为 16:03:04.708+01:00

我该怎么做?

使用OffsetTime.withOffsetSameInstant:

OffsetTime input = OffsetTime.of(14, 3, 4, 708000000, ZoneOffset.ofHours(-1));
System.out.println(input);

OffsetTime output = input.withOffsetSameInstant(ZoneOffset.ofHours(1));
System.out.println(output);

正如@Jesper 的回答正确地指出了在 OffsetTime 实例上更改偏移量的方法,而不更改它指向的 Instant 是通过调用 withOffsetSameInstant.

困难的部分是确定系统的默认偏移量。系统没有默认偏移量,它有一个默认值 ZoneIdZoneId 有一个偏移量,但如果应用夏令时,它可能会在全年发生变化。

从您的问题中我们不清楚我们是否可以确定一年中的哪个时间与您的用例相关。可能现在对您的用例有效。可能是您有一个 LocalDateOffsetTime 将根据该 LocalDate 进行评估。如果是这种情况,您可以像这样获得系统默认值:

    LocalDateTime localDateTime = LocalDateTime.of(localDate, offsetTime.toLocalTime());
    ZoneOffset offset = ZoneId.systemDefault().getRules().getOffset(localDateTime);
  1. 现代日期时间 API 基于 ISO 8601 并且不需要明确使用 DateTimeFormatter 对象,只要日期时间字符串符合 ISO 8601 标准.
  2. 观察地点DST的时区偏移根据summer/winter时间变化。因此,如果您所在的地方遵守 DST,则不应使用固定时区偏移量,例如+01:00 小时;相反,您应该从 API.
  3. 获取它

演示:

import java.time.OffsetTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        String strTime = "14:03:04.708-01:00";

        OffsetTime parsedOffsetTime = OffsetTime.parse(strTime);
        System.out.println(parsedOffsetTime);

        OffsetTime offsetTimeAtOffset0100 = parsedOffsetTime.withOffsetSameInstant(ZoneOffset.of("+01:00"));
        System.out.println(offsetTimeAtOffset0100);

        // Time at JVM's default timezone offset
        ZoneOffset jvmTzOffset = ZonedDateTime.now(ZoneId.systemDefault()).getOffset();
        OffsetTime offsetTimeAtJvmTzOffset = parsedOffsetTime.withOffsetSameInstant(jvmTzOffset);
        System.out.println(offsetTimeAtJvmTzOffset);
    }
}

输出:

14:03:04.708-01:00
16:03:04.708+01:00
16:03:04.708+01:00

注意: 我的时区是 Europe/London,当前时差为 01:00 小时。

详细了解 java.timemodern Date-Time API* from Trail: Date Time


* 无论出于何种原因,如果您必须坚持Java 6 或Java 7,您可以使用ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and