2016年11月6日,有两个01-02小时:
- 01:00:00 - 01:59:59 夏令时
- 01:00:00 - 01:59:59 标准时间
标准时间可以这样表示:
private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
public void DoSomething() {
DateTimeZone tz = DateTimeZone.forID("America/New_York");
localDateTime = formatter.withZone(tz).parseDateTime("2016-11-06 02:01:00");
}
然而,在过渡回标准时间之前的 01-02 小时内表示夏令时一直具有挑战性。看来与解析不明确时间相关的业务规则是“默认为标准时间”:
//Ambiguous time, treated as Standard
DateTime ambiguousTime = formatter.withZone(tz).parseDateTime("2016-11-06 01:59:00");
我不确定如何覆盖此规则,并区分日光和标准。这是 API 边界,我可以让客户提供几乎任何东西。我认为偏移量和时区应该足以消除这些极端情况的歧义,这似乎是 how NodaTime does it ?
如果这是使用 Joda 时间执行此操作的“正确”方法,有人可以提供一个示例吗?如果有其他方法,我也愿意这样做。
最佳答案
我无法找到一种方法来表示夏令时,除非通过格式化程序,将偏移量作为解析字符串的一部分。
这是一个例子。
private DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z");
public void DoSomething() {
String daylightWithOffset = "2016-11-06 01:56:00 -0400";
DateTime daylightUnambiguous = formatter.withZone("America/New_York").parseDateTime(daylightWithOffset);
System.out.println(daylightUnambiguous); //2016-11-06T01:56:00.000-04:00
String standardWithOffset = "2016-11-06 01:56:00 -0500";
DateTime standardUnambiguous = formatter.withZone("America/New_York").parseDateTime(standardWithOffset);
System.out.println(standardUnambiguous); //2016-11-06T01:56:00.000-05:00
}
在底层,这两个都具有正确的 UTC 时间表示,并且都具有与其关联的正确时区 (America/New_York
)。将它们显示为本地时间都会显示 01:56
,这是预期和期望的行为。
关于java - 如何使用 JodaTime 表示转换回标准时间期间的 "repeated"小时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36271378/