Java 的 BST ZoneId 代表啥?

Posted

技术标签:

【中文标题】Java 的 BST ZoneId 代表啥?【英文标题】:What does Java's BST ZoneId represent?Java 的 BST ZoneId 代表什么? 【发布时间】:2017-11-18 02:30:54 【问题描述】:

我在这个时间范围内存储在数据库中:伦敦(英国夏令时)从 15:00 到 16:00 的任何一天

如果我在此时间范围内收到事件,我需要执行程序。

我现在在巴黎 (16:22) 运行测试,而在伦敦是 15:22(所以在存储在数据库中的时间范围之间)。

这是我的代码

// create Local Date Time from what I have stored in the DB

LocalDateTime dateTime1 = LocalDateTime.of(2017, Month.JUNE, 15, 15, 00);
LocalDateTime dateTime2 = LocalDateTime.of(2017, Month.JUNE, 15, 16, 00);

Instant now = Instant.now();

System.out.println (now.isAfter (dateTime1.atZone(ZoneId.of("BST", ZoneId.SHORT_IDS)).toInstant()));
System.out.println (now.isBefore(dateTime2.atZone(ZoneId.of("BST", ZoneId.SHORT_IDS)).toInstant()));

理论上现在(巴黎的 16:22 / 伦敦的 15:22)在伦敦的 dateTime1 之后(15:00)和伦敦的 dateTime2(16:00)之前

但我知道现在不是那个 dateTime2 之前

【问题讨论】:

永远不要使用 3-4 个字符的缩写来表示时区。 这些是实时时区,没有标准化,甚至不是唯一的!使用true time zone names,格式为continent/region,例如Europe/LondonEurope/ParisAsia/KolkataPacific/Auckland 【参考方案1】:

如the javadoc of ZonedId.SHORT_IDS 所示,“BST”不是英国夏令时间,而是孟加拉国标准时间 (Asia/Dhaka)。

您可以通过以下方式检查值:

System.out.println(ZoneId.of("BST", ZoneId.SHORT_IDS));

所以我建议使用full time zone names 以避免任何混淆:

ZoneId london = ZoneId.of("Europe/London")

【讨论】:

恕我直言,为什么 Oracle 没有弃用这个 SHORT_IDS?对于大多数人来说,这是一个陷阱。 BST 是孟加拉国标准时间(在达卡全年使用)。 @MenoHochschild,如果您以友好的眼光阅读该文档,它会说 SHORT_IDS 仅包含在使用已弃用缩写的旧代码中,而不包含在新代码中。你还是有道理的。 然而 Date#toString() 返回... BST!

以上是关于Java 的 BST ZoneId 代表啥?的主要内容,如果未能解决你的问题,请参考以下文章

这个 Java 字符串中的“\1”代表啥?

java路径字符串中的一个点代表啥意思 例如 File path = new File("."); 这个点代表啥意思

运算符 ^ 在 java 中代表啥? [复制]

java里extends代表啥

Java里的每个符号代表啥意思

JAVA中的super代表啥意思??