时区格式,如何知道时区

Timezone format, how to know the timezone

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

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

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

看起来像 ISO 8601 格式:dateTime±hhmm。这里 hhmm 与 UTC

的偏移量

表示 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:仅推荐。

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. It is not exactly the ISO 8601 ISO_OFFSET_DATE_TIME 中解释,因为偏移量应该写成 +00:00 而不是 +0000

时区与时间偏移

然后,你可以用zdt.getZone()得到offset信息。但是,您只会得到 Offset ID:

  • Z - for UTC (ISO-8601)
  • +hh:mm or -hh:mm - if the seconds are zero (ISO-8601)
  • +hh:mm:ss or -hh:mm:ss - if the seconds are non-zero (not ISO-8601)

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

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

对于 SimpleDateFormat and DateTimeFormatterofPattern 方法,此时区模式可以由字符 Z 表示。

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

的模式表示
  • yyyy表示当前年份
  • MM代表当年的月份
  • dd代表当月的今天
  • 'T' 代表一个带引号的 T 字符
  • HH表示当天的当前小时
  • mm表示当前小时的当前分钟
  • ss表示当前分钟的当前秒数
  • Z 表示与 GMT 的时区偏移量