是否可以指定一个带有时区(即GMT偏移)但没有时间的ISO日期?

问题描述 投票:0回答:1

我想知道你是否可以在ISO中指定一个带有时区的日期,但不指定时间。

这可能看起来很奇怪,如果没有时间,却要指定时区,但技术上,一个日期代表了两个时间之间的范围......从午夜到午夜的24小时,而 "午夜 "必须是在一个时区。

在我们的案例中,我们有一个API,它想说 "过滤日期X之前的事情和日期Y之后的事情",我们希望用户为这两个日期指定 "4月9日"(在他们的时区),以获得在这一天发生的所有事情。

当然,我们通过在第一个日期上增加一天,然后将其改为纯'之前'来解决这个问题,但是前端需要做这个计算。我们在后端不能这样做,因为必须发送一个带时间的日期,意味着我们会在午夜发送4月9日,然后在后端增加一天,但如果有人在下午4点通过了呢?

如果日期的时间是非午夜,我们可以不通过,但是我们又回到了当初为什么要通过。

所以再说一遍,你能不能有一个带时区的日期,但没有时间成分?

swift date iso8601
1个回答
1
投票

解读 ISO8601的日期只与年-月-日和时区设置合适。formatOptionsISO8601DateFormatter

let isoFormatter = ISO8601DateFormatter()
isoFormatter.formatOptions = [.withFullDate, .withTimeZone]

1
投票

如果以 时区 你指的是UTC偏移(如ISO 8601中的日期与时间),这是没有问题的,如果你指的是真正的时区,与UTC有历史的、现在的和已知的未来的偏移,包括例如夏季的timeDST,如AmericaNew_York或北美东部时间,那么ISO 8601不支持。如果你说的时区是指真正的时区,有历史的、现在的和已知的未来的UTC偏移,包括夏季的时间DST,比如AmericaNew_York或北美东部时间,那么ISO 8601不支持,既不支持有时间的日期,也不支持没有时间的日期。

2020-04-25-04:00

这对于今年4月25日的偏移量-04:00的ISO 8601是完全有效的。所以你可以用它来表示从2020-04-25T00:00-04:00(含)到2020-04-26T00:00-04:00(不含)这个区间。这就相当于2020-04-25T04:00Z到2020-04-26T04:00Z(Z表示UTC)。

Java示例代码

我不懂Swift,所以不能告诉你如何在Swift中格式化或解析这样的字符串。在Java中格式化还不错。举个例子。

    LocalDate date = LocalDate.of(2020, Month.APRIL, 25);
    String isoOffsetDateString = date
            .atStartOfDay(ZoneId.of("America/New_York"))
            .format(DateTimeFormatter.ISO_OFFSET_DATE);
    System.out.println(isoOffsetDateString);

输出:

2020-04-25-04:00

我使用的是Java内置的 ISO_OFFSET_DATE 格式化。文档告诉我们,这个格式化器是。

ISO日期格式化器可以格式化或解析一个带有偏移量的日期,比如 "2011-12-03+01: 00"。

解析这个字符串并产生一天的开始和结束需要更多的时间。

    TemporalAccessor parsed
            = DateTimeFormatter.ISO_OFFSET_DATE.parse(isoOffsetDateString);
    Instant start = LocalDate.from(parsed)
            .atStartOfDay(ZoneOffset.from(parsed))
            .toInstant();
    Instant end = start.plus(1, ChronoUnit.DAYS);

    System.out.println("From " + start + " inclusive to " + end + " exclusive");

从2020-04-25T04:00:00Z(含)到2020-04-26T04:00:00Z(不含)。

我已经选择转换为 Instant瞬间的类,与偏移或时区无关。实例以UTC打印,因为尾部有一个 "小 "字。Z 上的每个说。在你的Java代码中,你可能喜欢不做这种转换,或者做不同的转换,这都要根据情况而定。

链接

© www.soinside.com 2019 - 2024. All rights reserved.