Java 我如何代表;“重复”;使用JodaTime转换回标准时间的时间?

Java 我如何代表;“重复”;使用JodaTime转换回标准时间的时间?,java,datetime,jodatime,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

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小时内表示白天是一项挑战。似乎与解析不明确时间相关联的业务规则是“默认为标准时间”:

我不确定如何推翻这一规则,并区分日光和标准。这是一个API边界,我可以让客户端提供几乎任何东西。我认为,一个带有时区的偏移量应该足以消除这些角落案例中的歧义,这似乎是


如果这是使用Joda time实现这一目标的“正确”方式,有人能举个例子吗?如果有其他方法,我也愿意这样做。

我找不到一种方法使夏令时具有代表性,除非通过格式化程序,将偏移量作为解析字符串的一部分

这里有一个例子

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时间表示,并且都有与之关联的适当时区(
美国/纽约
)。将它们显示为本地时间会同时显示
01:56
,这是预期和期望的行为。

除了通过格式化程序之外,我无法找到将偏移量作为解析字符串的一部分来表示夏令时的方法

这里有一个例子

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时间表示,并且都有与之关联的适当时区(
美国/纽约
)。将它们显示为本地时间会显示
01:56
,这是预期和期望的行为。

我不确定是否理解,是的,您的时间不明确,因为您没有在字符串表示中指定时区。你怎么知道它们是《纽约时报》,但不知道utc偏移量?IANA时区+日期时间不足以确定一年中某一天两小时内的确切时刻:时钟从夏令时倒转到标准时间的那一天。想象一下11月6日凌晨1:54在美国/纽约。那是UTC-4还是UTC-5?如果没有更多信息,您无法知道,因为第一次经过1-2小时,是UTC-4,第二次经过,是UTC-5。(1-2在Spring jump期间根本不存在。)我可以让一个客户提供它当时想要的意思(-4或-5),作为服务调用的一部分,但我不确定一旦我这样做,如何在JT内使用它。我相信有一种fromUTC方法?如果你知道偏移量,那么你可以用它。但我会先尝试将偏移量添加到字符串中是的,这似乎是一个解决方法:将偏移量添加为输入时间的一部分确实使日光(UTC-4)与标准(UTC-5)具有代表性。如果不在解析器中包含偏移量,我无法找到一种使其具有可表示性的方法。事实上,我想没关系。我不确定我是否理解,是的,您的时间不明确,因为您没有在字符串表示中指定时区。你怎么知道它们是《纽约时报》,但不知道utc偏移量?IANA时区+日期时间不足以确定一年中某一天两小时内的确切时刻:时钟从夏令时倒转到标准时间的那一天。想象一下11月6日凌晨1:54在美国/纽约。那是UTC-4还是UTC-5?如果没有更多信息,您无法知道,因为第一次经过1-2小时,是UTC-4,第二次经过,是UTC-5。(1-2在Spring jump期间根本不存在。)我可以让一个客户提供它当时想要的意思(-4或-5),作为服务调用的一部分,但我不确定一旦我这样做,如何在JT内使用它。我相信有一种fromUTC方法?如果你知道偏移量,那么你可以用它。但我会先尝试将偏移量添加到字符串中是的,这似乎是一个解决方法:将偏移量添加为输入时间的一部分确实使日光(UTC-4)与标准(UTC-5)具有代表性。如果不在解析器中包含偏移量,我无法找到一种使其具有可表示性的方法。事实上,我想那很好。