【问题标题】:Timezone format, how to know the timezone时区格式,如何知道时区
【发布时间】:2018-03-11 03:48:11
【问题描述】:

我得到了以下格式的时间戳:

2017-09-27T16:19:24+0000

我怎么知道是哪个时区?如果我使用的是 Java 8,DateTimeFormatter 是什么?

【问题讨论】:

  • 您的输入是原始字符串?你想要时区还是时间偏移?显然,仅使用偏移量,仅使用此信息获取时区并没有什么魔力
  • @Al1 是的,它是原始字符串。我认为有某种日期时间掩码可用?但这是哪个时区?
  • +0000 清楚地告诉您它已转换为 UTC。
  • @Optional 我明白了,所以基准总是 UTC?
  • 例如,UTC 全年为 +0000,但欧洲/伦敦从 10 月下旬至 3 月下旬仅为 +0000。

标签: java java-8 timezone timezone-offset


【解决方案1】:

给定的时间戳有一个时区偏移量 (+0000),表示距 GMT+00 +00 小时和 +00 分钟。

对于SimpleDateFormatDateTimeFormatterofPattern 方法,这个时区模式可以用字符Z 表示。

您正在处理的时区可以用yyyy-MM-dd'T'HH:mm:ssZ的模式表示:

  • yyyy 代表当前年份
  • MM 代表当年的月份
  • dd 代表当月的当天
  • 'T' 表示引用的 T 字符
  • HH 代表当天的当前小时
  • mm 表示当前小时的当前分钟
  • ss 代表当前分钟的当前秒
  • Z 表示与 GMT 的时区偏移

【讨论】:

  • GMT 和 UTC 全年一致,对吗?
  • 是的。尽管某些时区会经历 DST,但 GMT 和 UTC 是恒定的,并且时区会相对于此发生变化。
【解决方案2】:

ZonedDateTime

正如您使用 Java 8 所说,您可以通过使用来利用 ZonedDateTime

ZonedDateTime zdt = ZonedDateTime.parse("2017-09-27T16:19:24+0000", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")

解析规则在DateTimeFormatter documentation 中解释。它不完全是ISO 8601 ISO_OFFSET_DATE_TIME,因为偏移量应该写成+00:00而不是+0000

时区与时间偏移

然后,您可以通过zdt.getZone() 获取偏移量信息。但是,您只会得到Offset ID

  • Z - 用于 UTC (ISO-8601)
  • +hh:mm 或 -hh:mm - 如果秒数为零 (ISO-8601)
  • +hh:mm:ss 或 -hh:mm:ss - 如果秒数不为零(非 ISO-8601)

正如一条评论所说,请注意时间偏移不是时区:给定的时区(例如法国的时间)在全年(夏季时间与冬季时间)没有相同的偏移量)。

【讨论】:

  • 由于输入只有偏移量,没有时区信息,也可以使用OffsetDateTime
【解决方案3】:

表示 2017-09-27T16:19:24+0000 给出 +0000 所以基准 UTC。

时间戳本身和 LocalDateTime 包含很长的秒数,并且不包含单独的时区信息。

Java 提供了class that maintains an addition time zone

ZonedDateTime dt = LocalDateTime.now().atZone(ZoneId.of("Europe/Sofia"));

需要确保时间存储为 UTC,+0000:仅供参考。

【讨论】:

    【解决方案4】:

    它看起来像 ISO 8601 格式:dateTime±hhmm。这里 hhmm 是从 UTC 偏移的

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2010-10-07
      相关资源
      最近更新 更多