java - 如何使用 JodaTime 表示转换回标准时间期间的 "repeated"小时?

标签 java datetime jodatime

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/

相关文章:

java - 如何为 @Inheritance JPA 注释指定不同的列

java - JodaTime 比较两个不同时区的日期

java - Hibernate 类型解析器

c# - DateTime代表C#中的多少位

java - 从 String 解析为 LocalDateTime 格式的正确模式

c# - 从 DateTime 中减去天数

java - 如何查看两个日期之间固定时间段的数量?

javascript - 如何将 servlet 中的字符串解析为 javascript 并创建包含数组值的格式化对象

Java正则表达式模式来匹配单词或短语

java - 即使使用工具,Java 中对象的内存地址