- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
转换时 Instant
至 LocalDateTime
可能会发生几个不同的Instant
s 转换为相同的 LocalDateTime
.例如。在有夏令时的时区。
我的问题是是否可以编写一个适用于任何 ZoneId
的通用函数和 LocalDateTime
并返回所有 Instant
位于给定时区的 s 映射到给定 LocalDateTime
:
List<Instant> localToInstants(LocalDateTime dt, ZoneId zone)
最佳答案
是的✔️
编辑
M. Prokhorov 使用 ZoneRules.getValidOffset()
的想法提供了比我原来的答案更优雅的代码。这是一个返回 Instant
列表的版本s 按要求:
public static List<Instant> localToInstants(LocalDateTime dt, ZoneId zone) {
return zone.getRules()
.getValidOffsets(dt)
.stream()
.map(dt::atOffset)
.map(OffsetDateTime::toInstant)
.collect(Collectors.toList());
}
让我们用几个重要的例子来尝试一下。马耳他将于 3 月 28 日过渡到夏令时。在凌晨 2 点,时钟向前调至 3。因此这一天不存在 2:30 时间。这意味着我们期望从以下调用中得到一个空列表:
LocalDateTime dt = LocalDateTime.of(2021, Month.MARCH, 28, 2, 30);
System.out.println(localToInstants(dt, ZoneId.of("Europe/Malta")));
输出确实是:
[]
ZoneRules.getValidOffsets()
返回一个空列表。剩下的很无聊:没有偏移量可以转换为
OffsetDateTime
并进一步到
Instant
,因此返回空列表。
LocalDateTime dt = LocalDateTime.of(2021, Month.MAY, 8, 21, 30);
System.out.println(localToInstants(dt, ZoneId.of("Pacific/Easter")));
[2021-05-09T02:30:00Z, 2021-05-09T03:30:00Z]
getValidOffsets()
返回了两个有效的偏移量,-05:00 和 -06:00,所以代码产生了两个
OffsetDateTime
依次转换为两个不同的对象
Instant
对象。
ZonedDateTime
对象。
public static List<Instant> localToInstants(LocalDateTime dt, ZoneId zone) {
return Stream.of(dt.atZone(zone).withEarlierOffsetAtOverlap(),
dt.atZone(zone).withLaterOffsetAtOverlap())
.filter(zdt -> zdt.toLocalDateTime().equals(dt))
.map(ZonedDateTime::toInstant)
.distinct()
.collect(Collectors.toList());
}
让我们用几个重要的例子来尝试一下。马耳他将于 3 月 28 日过渡到夏令时。在凌晨 2 点,时钟向前调至 3。因此这一天不存在 2:30 时间。这意味着我们期望从以下调用中得到一个空列表:
LocalDateTime dt = LocalDateTime.of(2021, Month.MARCH, 28, 2, 30);
System.out.println(localToInstants(dt, ZoneId.of("Europe/Malta")));
输出确实是:
[]
dt.atZone(zone)
给我们 3:30 而不是 2:30。 Java 增加了间隔的长度,对于夏季时间过渡,像往常一样一小时。调用
withEarlierOffsetAtOverlap()
和
withLaterOffsetAtOverlap()
在这种情况下没有区别(我会回到他们身上),所以我们只是得到相同的
ZonedDateTime
两次。调用
filter()
区别在于:我们转换
ZonedDateTime
返回
LocalDateTime
并发现我们没有得到相同的时间,因此我们丢弃了结果。剩下的很无聊:没有
ZonedDateTime
s 转换为
Instant
,所以我们最终得到一个空列表。
LocalDateTime dt = LocalDateTime.of(2021, Month.MAY, 8, 21, 30);
System.out.println(localToInstants(dt, ZoneId.of("Pacific/Easter")));
[2021-05-09T02:30:00Z, 2021-05-09T03:30:00Z]
withEarlierOffsetAtOverlap()
的地方和
withLaterOffsetAtOverlap()
参加进来。
dt.atZone(zone)
给了我们一个选项(
2021-05-08T21:30-05:00[Pacific/Easter]
,所以是较早的一个,但没有理智的人会记住这一点)。由于 Java 知道此时存在重叠,
withEarlierOffsetAtOverlap()
和
withLaterOffsetAtOverlap()
给我们两种不同的可能性。由于两者都转换回正确的
LocalDateTime
,没有过滤掉任何东西。由于两者是不同的时刻,
distinct()
也不会过滤掉任何东西。我们最终得到两个
Instant
对象。
ZoneRules.getValidOffsets()
关于java - 如何找到对应于给定 LocalDateTime 和 ZoneId 的所有 Instants?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66606960/
要获得一个 ZoneId 它是这样的: ZoneId.of("America/Sao_Paulo"); 或 ZoneId.of(ZoneId.SHORT_IDS.get("BET")); 为什么不存在
ZoneId.of("Australia/ACT").getRules().getOffset(LocalDateTime.of(2019, 03, 31, 13, 0, 0, 0)) 返回 +11:
通过 of("...") 方法获取 ZoneId 需要一个具有特定 ID 的字符串。可以使用 ZoneId.getAvailableZoneIds() 检索可用的 ID。这将返回(至少在我的系统和 J
本文整理了Java中java.time.ZoneId.from()方法的一些代码示例,展示了ZoneId.from()的具体用法。这些代码示例主要来源于Github/Stackoverflow/Mav
本文整理了Java中java.time.ZoneId.of()方法的一些代码示例,展示了ZoneId.of()的具体用法。这些代码示例主要来源于Github/Stackoverflow/Maven等平
我有一个时区列表,我希望用户从中进行选择。所以,我认为我可以调用 java.time.ZoneId.getAvailableZoneIds() 并对它们使用方法 getDisplayName。这会导致
我现在正在巴黎运行这段代码,时间是 12:40,其中 ECT = ECT - Europe/Paris LocalDateTime creationDateTime = LocalDateTime.n
本文整理了Java中java.time.ZoneId.normalized()方法的一些代码示例,展示了ZoneId.normalized()的具体用法。这些代码示例主要来源于Github/Stack
本文整理了Java中java.time.ZoneId.ofOffset()方法的一些代码示例,展示了ZoneId.ofOffset()的具体用法。这些代码示例主要来源于Github/Stackover
本文整理了Java中java.time.ZoneId.getDisplayName()方法的一些代码示例,展示了ZoneId.getDisplayName()的具体用法。这些代码示例主要来源于Gith
本文整理了Java中java.time.ZoneId.hashCode()方法的一些代码示例,展示了ZoneId.hashCode()的具体用法。这些代码示例主要来源于Github/Stackover
本文整理了Java中java.time.ZoneId.toString()方法的一些代码示例,展示了ZoneId.toString()的具体用法。这些代码示例主要来源于Github/Stackover
本文整理了Java中java.time.ZoneId.equals()方法的一些代码示例,展示了ZoneId.equals()的具体用法。这些代码示例主要来源于Github/Stackoverflow
本文整理了Java中java.time.ZoneId.getAvailableZoneIds()方法的一些代码示例,展示了ZoneId.getAvailableZoneIds()的具体用法。这些代码示
本文整理了Java中java.time.ZoneId.systemDefault()方法的一些代码示例,展示了ZoneId.systemDefault()的具体用法。这些代码示例主要来源于Github
本文整理了Java中java.time.ZoneId.getRules()方法的一些代码示例,展示了ZoneId.getRules()的具体用法。这些代码示例主要来源于Github/Stackover
本文整理了Java中java.time.ZoneId.getId()方法的一些代码示例,展示了ZoneId.getId()的具体用法。这些代码示例主要来源于Github/Stackoverflow/M
本文整理了Java中org.threeten.bp.ZoneId.of()方法的一些代码示例,展示了ZoneId.of()的具体用法。这些代码示例主要来源于Github/Stackoverflow/M
我有一些代码可以从记录中读取短时区 ID 并将其传递给以下内容: ZoneId.of(ZoneId.SHORT_IDS.get(place.getTz())) 我无法控制使用什么时区 ID,但我的印象
我正在尝试使用 Java 的 ZoneId 和 ZoneOffsetTransitionRule 为 iCalendar VTIMEZONE 对象建模。 我的 VTIMEZONE 对象看起来像 BEG
我是一名优秀的程序员,十分优秀!