【发布时间】:2015-03-23 10:27:23
【问题描述】:
为了处理OffsetTime,我想将其转换为本地OffsetTime。例如,如果系统默认偏移量为+1:00,则将14:03:04.708-01:00 转换为16:03:04.708+01:00。
我该怎么做?
【问题讨论】:
标签: java datetime time java-8 datetimeoffset
为了处理OffsetTime,我想将其转换为本地OffsetTime。例如,如果系统默认偏移量为+1:00,则将14:03:04.708-01:00 转换为16:03:04.708+01:00。
我该怎么做?
【问题讨论】:
标签: java datetime time java-8 datetimeoffset
使用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);
【讨论】:
OffsetTime.now().getOffset() 获取系统默认偏移量的唯一方法吗?
正如@Jesper 的回答正确地说明了更改OffsetTime 实例上的偏移量的方法,而不更改它指向的Instant 是通过调用withOffsetSameInstant。
困难的部分是确定系统的默认偏移量。系统没有默认偏移量,它有一个默认的ZoneId。 ZoneId 有一个偏移量,但如果应用 DST,这可能会在全年发生变化。
您的问题不清楚我们是否可以确定一年中的哪个时间与您的用例相关。现在可能对您的用例有效。可能是您有一个 LocalDate 来评估 OffsetTime。如果是这种情况,您可以像这样获得系统默认值:
LocalDateTime localDateTime = LocalDateTime.of(localDate, offsetTime.toLocalTime());
ZoneOffset offset = ZoneId.systemDefault().getRules().getOffset(localDateTime);
【讨论】:
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 小时。
从Trail: Date Time了解更多关于java.timemodern Date-Time API*的信息。
* 出于任何原因,如果您必须坚持使用 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。
【讨论】: