时区格式,如何确定时区

4

我得到了一个以以下格式表示的时间戳:

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

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


@Optional 我明白了,那么基准时间将始终为UTC? - musicsquad
@Optional 我的意思是,如果是+0530,那么这意味着比协调世界时提前5小时30分钟,对吗?这就是我所说的“基准是协调世界时”的意思。 - musicsquad
你可以根据偏移量猜测时区,但你可能会遇到使用不同夏令时规则的具有相同时间偏移量的世界各地的部分。 - Powerlord
2
例如,UTC全年都是+0000,但欧洲/伦敦仅在每年的10月底至次年3月底为+0000。 - Powerlord
@Powerlord 我明白了,我猜那是因为人类制定了夏令时?感谢您的解释。 - musicsquad
显示剩余6条评论
4个回答

3

ZonedDateTime

如果您使用Java 8,可以通过以下方式利用ZonedDateTime:

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

解析规则在DateTimeFormatter文档中有说明。它与ISO 8601 ISO_OFFSET_DATE_TIME不完全相同,因为偏移量应该写成+00:00而不是+0000

时区 vs 时间偏移

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

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

正如一位评论所说,要注意时间偏移不等同于时区:某个特定的时区(例如法国时间)在整年中的偏移量并不相同(夏令时和冬令时不同)。


2
由于输入只有偏移量,而没有时区信息,因此您也可以使用OffsetDateTime - user7605325

3
给定的时间戳带有时区偏移量(+0000),表示距离GMT+00的+00小时和+00分钟。
这个时区模式可以用字符Z表示,适用于SimpleDateFormatDateTimeFormatterofPattern方法。
你正在处理的时区可以用yyyy-MM-dd'T'HH:mm:ssZ的模式表示:
  • yyyy表示当前年份
  • MM表示当前年份的月份
  • dd表示当前月份的日期
  • 'T'表示一个带引号的T字符
  • HH表示当天的当前小时数
  • mm表示当前小时的当前分钟数
  • ss表示当前分钟的当前秒数
  • Z表示距离GMT的时区偏移量

格林威治标准时间和协调世界时在全年内保持一致,对吗? - musicsquad
是的。尽管一些时区会经历夏令时,但GMT和UTC是恒定的,而时区相对于它们而变化。 - user3853021

1
似乎是 ISO 8601 格式:dateTime±hhmm。这里的 hhmm 是与 UTC 的偏移量。

1

表示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:仅建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接