使用存储历史对象时区信息的系统,如下所示:

o1:    dt= 2022-07-15 13:32:00  offset=5   dst=false    
o2:    dt= 2022-01-15 13:32:00  offset=5   dst=true     
o3:    dt= 2022-07-15 13:32:00  offset=7   dst=false    

如果它能存储像"美国/纽约"这样的IANA时区,生活会轻松得多,但这就是我必须处理的问题.我的最终目标是将这些历史日期与当前时间进行比较,并获得它们之间的时差.

创建当前时间很容易.我可以在UTC获得它

   ZonedDateTime.now(ZoneId.of("UTC"))
   2022-07-15T15:33:04.177Z[UTC]

或者我的本地时区

ZonedDateTime.now()
2022-07-15T11:33:28.648-04:00[America/New_York]

问题是,我如何将表格数据读入ZonedDateTime进行苹果对苹果的比较.比如一些神奇的方法,比如

ZonedDateTime.fromOffset(5).fromDst(false).asTz('UTC')

推荐答案

可以使用ZoneOffset和指定的偏移量,DST真/假在这里似乎不相关.假设显示的时间戳是本地的(而不是UTC),您可以执行以下操作:

public static void main(String[] args) {
    record TimestampAndOffset(String timestamp, int offsetHours) { }
    
    var timeData = List.of(
            new TimestampAndOffset("2022-07-15T13:32:00", 5),
            new TimestampAndOffset("2022-01-15T13:32:00", 5),
            new TimestampAndOffset("2022-07-15T13:32:00", 7));

    timeData.forEach(to -> {
        LocalDateTime localTimestamp = LocalDateTime.parse(to.timestamp());
        var zoneOffset = ZoneOffset.ofHours(to.offsetHours());
        var zonedValue = ZonedDateTime.of(localTimestamp, zoneOffset);
        System.out.println(zonedValue);
        System.out.println(zonedValue.withZoneSameInstant(ZoneOffset.UTC));
    });
}

为了简化本例的解析,我使用ISO-8601格式,并用T作为分隔符.

输出:

2022-07-15T13:32+05:00
2022-07-15T08:32Z
2022-01-15T13:32+05:00
2022-01-15T08:32Z
2022-07-15T13:32+07:00
2022-07-15T06:32Z

重要提示正如user16320675在 comments 中指出的那样,请仔细判断偏移量的含义,因为根据问题的original version,您的数据可能使用反向偏移量(例如,5而不是-5),在这种情况下,您需要使用ZoneOffset.ofHours(-to.offsetHours()).

正如Basil Bourque在 comments 中提到的那样,考虑使用OffsetDateTime是否对您的用例更有意义.

Java相关问答推荐

Proguard配置以保留具有参数的注释的成员

当列顺序更改时,Table View列列表的Change. wasPermanted()总是返回假

Java事件系统通用转换为有界通配符

scanner 如何在执行hasNextLine一次后重新读取整个文件?

如何在Javascript中设置文本区域圆角的样式

同时运行JUnit测试和Selenium/Cucumber测试时出现问题

Java自定义ThreadPool—暂停任务提交并取消当前排队任务

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

为什么Java Annotation接口覆盖对象类中的方法

PDFBox未加载内容

使用Class.this.field=Value初始化构造函数中的最后一个字段会产生错误,而使用this.field=Value则不会

Java泛型类方法的静态返回类型是否被类型擦除?

S数学.exp的相同错误保证也适用于StrictMath.exp吗?

如何在Record Java中使用isRecord()和RecordComponent[]?

接受类及其接口的Java类型(矛盾)

H2数据库仅支持%1个结果集?

从字节数组切换到JakartaMail org.springframework.mail.javamail.JavaMailSender InputStreamResource

将基于实例编号的对象列表拆分为新的对象列表

java.lang.NoSuchMethodError:';org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream$Builder org.apache.poi-poi-ooxml-5.2.4

Springboot应用程序无法识别任何@RestController或@Service,我认为@Repository也无法识别