为了处理OffsetTime
,我想将其转换为本地OffsetTime
。例如,如果系统默认偏移量为14:03:04.708-01:00
,则将16:03:04.708+01:00
转换为+1:00
。
我该怎么做?
答案 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
。
困难的部分是确定系统的默认偏移量。系统没有默认偏移量,它具有默认的ZoneId
。 ZoneId
有偏移量,但如果应用DST,则可能会在一年中发生变化。
从您的问题不清楚我们是否可以确定一年中哪个时间与您的用例相关。现在可能对您的用例有效。您可能需要LocalDate
来评估OffsetTime
。如果是这种情况,您可以像这样获得系统默认值:
LocalDateTime localDateTime = LocalDateTime.of(localDate, offsetTime.toLocalTime());
ZoneOffset offset = ZoneId.systemDefault().getRules().getOffset(localDateTime);
答案 2 :(得分:0)
DateTimeFormatter
对象。+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.time
,Trail: Date Time*。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。