当前位置: 首页 > 知识库问答 >
问题:

如何将偏移整数映射到IANA时区

宇文飞羽
2023-03-14

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

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.from偏移量(5). fromDst(false). asTz('UTC')

共有1个答案

夏兴生
2023-03-14

您可以使用具有指定偏移量的ZoneOffset,DST true/false在这里似乎不相关。假设显示的时间戳是本地的(而不是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

重要提示:正如用户16320675在评论中指出的那样,请仔细检查偏移量的含义,因为根据问题的原始版本,您的数据可能使用反向偏移量(例如5而不是-5),在这种情况下,您需要使用ZoneOffset。小时(-to.offsetHours())

 类似资料:
  • 我在mapstruct映射器上遇到了问题。当运行mvn clean install(或mvn clean compile)时,我会得到以下错误: 问题是我不知道mapstruct从哪里获得这个“java.lang.Integer Architecture.Loads”。我不明白这个整数是从哪里来的,正如您在我的代码中看到的,没有整数。而且,到目前为止,我在使用类似的映射器时从未遇到过这个错误。 下

  • 我试图将请求体从邮递员映射到spring boot实体,

  • 问题内容: 我将Spring JPA与Hibernate和Postgres一起使用 在实体中,我尝试使用List和integer [] 在数据库中,我有一列类型: 有什么JPA使用方式吗? 问题答案: JPA无法直接将数组持久化到单独的表或数据库数组(例如,映射到的数组)。因此,您有两种方法: 1)用于将该列另存为BLOB或CLOB 2)使用而不是数组

  • 预期的输出是值的排序数组:。

  • 问题内容: 我想将a存储在列中并保持不变。这两个和是“本地”类型的定义。因此, 时区 的概念不应以任何方式干涉。 下面的代码是一个最小示例,该示例在内存数据库中创建带有列的表。Maven工件必须在类路径中。 首先,定义方法和: 请注意,该方法使用单引号引起来的值,因此Java™没有机会创建时区歧义。现在,一次调用几次,每次使用不同的时区设置: 然后打印以下内容: 假设数据库表未更改,如何编写该方法

  • 问题内容: 我在了解如何实现这一目标方面遇到了问题。 基本上我们有一个API,用户发送以下格式的JSON :(如果代码不完美,请原谅,但您可以理解) 好的,我不确定我是否正确设置了JSON格式,但是现在这是我的问题。 我有一个带有参数Name,Last的类,还有一个作为其成员之一的对象Client和Property Date。 像这样: 因此,基本上,我不确定如何获取JSON,然后将其映射到我的对