Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将OffsetTime转换为本地OffsetTime?_Java_Datetime_Time_Java 8_Datetimeoffset - Fatal编程技术网

Java 如何将OffsetTime转换为本地OffsetTime?

Java 如何将OffsetTime转换为本地OffsetTime?,java,datetime,time,java-8,datetimeoffset,Java,Datetime,Time,Java 8,Datetimeoffset,为了处理OffsetTime,我想将其转换为本地OffsetTime。例如,如果系统默认偏移量为+1:00,则将14:03:04.708-01:00转换为16:03:04.708+01:00 我该怎么做 使用: 正如@Jesper的回答正确地说明了如何在OffsetTime实例上更改偏移量,而不更改它所指向的即时是通过调用withOffsetSameInstant 难点在于确定系统的默认偏移量。系统没有默认偏移量,它有一个默认的ZoneId。ZoneId有一个偏移量,但如果采用DST,该偏移量可

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

我该怎么做

使用:


正如@Jesper的回答正确地说明了如何在
OffsetTime
实例上更改偏移量,而不更改它所指向的
即时
是通过调用
withOffsetSameInstant

难点在于确定系统的默认偏移量。系统没有默认偏移量,它有一个默认的
ZoneId
ZoneId
有一个偏移量,但如果采用DST,该偏移量可能全年都会发生变化

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

    LocalDateTime localDateTime = LocalDateTime.of(localDate, offsetTime.toLocalTime());
    ZoneOffset offset = ZoneId.systemDefault().getRules().getOffset(localDateTime);
  • 现代日期时间API基于并且不需要显式使用
    DateTimeFormatter
    对象,只要日期时间字符串符合ISO 8601标准
  • 观测地点的时区偏移量随夏季/冬季时间的变化而变化。因此,如果您所在地遵守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
    
    输出:

    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
    
    注意:我的时区是
    欧洲/伦敦
    ,当前偏移量为
    01:00
    小时

    了解更多关于
    java.time
    、来自的*


    *无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

    这将对其进行硬编码,而不是采用系统默认值。谢谢,这使我领先了一步。但是,它仍然使用ZoneOffset常量而不是系统默认值。
    OffsetTime.now().getOffset()
    是获取系统默认偏移量的唯一方法吗?问题是使用DST的区域在冬季和夏季具有不同的偏移量