Java-如何将yyyy mm ddThh:mm:ssZ解析为特定的时区和格式?

Java-如何将yyyy mm ddThh:mm:ssZ解析为特定的时区和格式?,java,parsing,time,Java,Parsing,Time,如何将yyyy mm ddThh:mm:ssZ解析为我的特定时区并仅显示时间 例如: 从2017-11-22T22:00:00Z 至2017-11-22 23:00 因为我的时区比第一个字符串所在的时区提前了一个小时,我希望你能理解 首先,将字符串解析为即时,然后将其转换为所需区域中的ZoneDateTime;从中,您可以获得LocalTime LocalTime time = Instant.parse(str).atZone(ZoneId.systemDefault()).toLocalTi

如何将yyyy mm ddThh:mm:ssZ解析为我的特定时区并仅显示时间

例如: 从2017-11-22T22:00:00Z 至2017-11-22 23:00


因为我的时区比第一个字符串所在的时区提前了一个小时,我希望你能理解

首先,将字符串解析为
即时
,然后将其转换为所需区域中的
ZoneDateTime
;从中,您可以获得
LocalTime

LocalTime time = Instant.parse(str).atZone(ZoneId.systemDefault()).toLocalTime();


如果使用Java 8,您可以将其解析为
即时
,然后将其转换为所需时区中的
ZoneDateTime
。然后,您可以从
ZoneDateTime
获取本地时间

Instant instant = Instant.parse("2017-11-22T22:00:00Z");
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println(zdt.toLocalTime());
也可以指定系统默认值以外的特定区域ID。要查看可供选择的可用区域ID,请使用
ZoneId.getAvailableZoneId())


使用
ZoneDateTime
将处理夏令时。如果您只需要静态小时偏移量,可以将其转换为
OffsetDateTime
,而不是
zoneDateTime

另请参见使用年份
0001
会引发与零年相关的日历问题,并尝试表示历史日期。如果您的实际问题是关于当代的,请编辑以显示。发布前搜索堆栈溢出。解析ISO 8601字符串、调整为时区以及提取一天中的某个时间等问题都已经处理了很多次。这与时区无关。此代码使用了应该避免的麻烦的旧遗留类。这个问题使用了它们的现代替代品java.time classes.Correct。或者,您可以调用
Instant::atZone
生成
zoneDateTime
。没有更好,只是口味问题。仅供参考:美国/纽约时区的有趣结果:
19:03:58
。1883年之前纽约的时区为UTC-4:56:02。
Instant instant = Instant.parse("2017-11-22T22:00:00Z");
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println(zdt.toLocalTime());