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/London
、Europe/Paris
、Asia/Kolkata
、Pacific/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 代表啥?的主要内容,如果未能解决你的问题,请参考以下文章