【问题标题】:How to get DST offset with Joda Time如何使用 Joda Time 获取 DST 偏移量
【发布时间】:2014-09-03 14:55:22
【问题描述】:

在我的 java 程序中,我做了这样的事情

1.)

LocalDateTime currentDateTime = new LocalDateTime();

LocalDateTime newDateTime = new LocalDateTime(currentDateTime);
newDateTime = newDateTime.plusDays(daysOffset);
newDateTime = newDateTime.plusHours(hoursOffset);
newDateTime = newDateTime.plusMinutes(minutesOffset);

稍后在我做的代码中

2.)

boolean newDateTimeIsInWinter =
                    dateTimeZone.getOffset(newDateTime.toDateTime().getMillis()) == dateTimeZone.getStandardOffset(newDateTime.toDateTime().getMillis());

调用newDateTime.toDateTime() 可能会导致java.lang.IllegalArgumentException: Illegal instant due to time zone offset transition

所以我想在 1.) 和 2.) 之间添加这样的内容。

if (dateTimeZone.isLocalDateTimeGap(newDateTime))
{
    int dstOffsetMinutes = ???;
    newDateTime = newDateTime.plusMinutes(dstOffsetMinutes);
}

谁能告诉我??? 的正确替代品?这不像将它设置为60 那样简单。例如 LHST 时区只有 30 分钟的偏移量。

【问题讨论】:

    标签: java jodatime


    【解决方案1】:

    询问DateTimeZome关于夏令时

    要确定特定时刻是否处于特定时区的夏令时,请询问 [DateTimeZone][1] 对象。

    boolean isStandardTime = DateTimeZone.forID( "America/Montreal" ).isStandardOffset( DateTime.now().getMillis() );
    

    何时使用“本地”类

    如果您关心时区、偏移量和夏令时,请不要使用LocalDateTimeLocalDateLocalTime。这就是DateTime 的用途。

    当您指的是日期和/或时间一般时,请使用“本地”类,而不是针对特定地点或时区。例如,如果您想说“圣诞节从 2014-12-25T00:00:00.000 开始”,这意味着 25 日早上的午夜在任何特定地点。但 LocalDateTime 可能意味着一个 DateTime 代表巴黎,但蒙特利尔的另一个DateTime(不同的时刻)。

    【讨论】:

    • 感谢您对 LocalDateTime 和 DateTime 的澄清。但我的问题“dstOffset 有多长”仍然存在
    【解决方案2】:

    解决了我的问题,使用 DateTime 代替 LocalDateTime

    1.) 现在是

    DateTime newDateTimeUTC = currentDateTime.toDateTime();
    newDateTimeUTC = newDateTimeUTC.plusDays(daysOffset);
    newDateTimeUTC = newDateTimeUTC.plusHours(hoursOffset);
    newDateTimeUTC = newDateTimeUTC.plusMinutes(minutesOffset);
    
    LocalDateTime newDateTime = newDateTimeUTC.toLocalDateTime();
    

    2.) 仍然是

    boolean newDateTimeIsInWinter =
        dateTimeZone.getOffset(newDateTime.toDateTime().getMillis()) == dateTimeZone.getStandardOffset(newDateTime.toDateTime().getMillis());
    

    不需要isLocalDateTimeGap 或其他任何东西。

    但这仍然不能回答原始问题如何使用 Joda Time 获得 DST 偏移量?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-11
      • 2015-08-12
      • 2013-01-14
      • 2012-09-12
      • 2015-11-06
      • 1970-01-01
      • 2012-10-30
      • 2013-09-18
      相关资源
      最近更新 更多