如何将OffsetTime转换为本地OffsetTime?

时间:2015-03-23 10:27:24

标签: java datetime time java-8 datetimeoffset

为了处理OffsetTime,我想将其转换为本地OffsetTime。例如,如果系统默认偏移量为14:03:04.708-01:00,则将16:03:04.708+01:00转换为+1:00

我该怎么做?

3 个答案:

答案 0 :(得分:1)

使用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);

答案 1 :(得分:1)

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

困难的部分是确定系统的默认偏移量。系统没有默认偏移量,它具有默认的ZoneIdZoneId有偏移量,但如果应用DST,则可能会在一年中发生变化。

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

    LocalDateTime localDateTime = LocalDateTime.of(localDate, offsetTime.toLocalTime());
    ZoneOffset offset = ZoneId.systemDefault().getRules().getOffset(localDateTime);

答案 2 :(得分:0)

  1. 现代日期时间 API 基于 ISO 8601,只要日期时间字符串符合 ISO 8601 标准,就不需要明确使用 DateTimeFormatter 对象。
  2. 观测地点 DST 的时区偏移量随夏/冬时间而变化。因此,如果您的地方遵守 DST,则不应使用固定的时区偏移,例如+01:00 小时;相反,您应该从 API 获取它。

演示:

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 小时的偏移量。

modern Date-Time API 中详细了解 java.timeTrail: Date Time*


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project