【问题标题】:Java - how to parse yyyy-mm-ddThh:mm:ssZ to a specific time zone and format? [duplicate]Java - 如何将 yyyy-mm-ddThh:mm:ssZ 解析为特定时区和格式? [复制]
【发布时间】:2018-05-06 16:54:26
【问题描述】:

如何将 yyyy-mm-ddThh:mm:ssZ 解析到我的特定时区并只显示时间?

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

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

【问题讨论】:

  • 您对年份 0001 的使用引发了与零年相关的日历问题,并试图表示历史日期。如果您的实际问题与当代有关,请编辑以显示。
  • 发帖前搜索 Stack Overflow。解析 ISO 8601 字符串、调整到时区和提取时间的问题都已经处理过很多次了。

标签: java parsing time


【解决方案1】:

如果使用 Java 8,您可以将其解析为 Instant,然后在您需要的时区将其转换为 ZonedDateTime。然后您可以从ZonedDateTime 获取当地时间。

Instant instant = Instant.parse("2017-11-22T22:00:00Z");
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println(zdt.toLocalTime());

您还可以指定系统默认值以外的特定区域 ID。要查看可供选择的可用区域 ID,请使用 ZoneId.getAvailableZoneIds())

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

【讨论】:

  • 正确。或者,您可以致电Instant::atZone 生成ZonedDateTime。没有更好的,只是口味问题。
  • 仅供参考:America/New_York 时区的有趣结果:19:03:58。由于 1883 年之前的纽约时区为 UTC -4:56:02
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    Java DateFormater

    String date = "2011-01-18 00:00:00";
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyy-mm-dd hh:mm:ss"); 
    Date parsedDate = dateFormat.parse(date);
    

    【讨论】:

    • 不遵守时区。
    • 这段代码使用了麻烦的旧遗留类,应该避免使用。问题使用他们的现代替代品 java.time 类。
    猜你喜欢
    • 1970-01-01
    • 2019-07-28
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多