在 Joda Time 的帮助下使用夏令时的正确方法

Posted

技术标签:

【中文标题】在 Joda Time 的帮助下使用夏令时的正确方法【英文标题】:Correct way to use periods for daylight saving with the help of Joda Time 【发布时间】:2013-11-23 00:22:23 【问题描述】:

由于那天是夏令时,我得到的结果不正确。

我用过,

Calendar todays = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"));
todays.set(Calendar.HOUR_OF_DAY, 24);
todays.set(Calendar.MINUTE, 0);
todays.set(Calendar.SECOND, 0);
todays.set(Calendar.MILLISECOND, 0);

如Joda-Time doc中所述,

考虑在夏令时边界增加 1 天。如果你使用一个 进行添加的时间,然后将添加 23 或 25 小时作为 合适的。如果您创建了一个等于 24 小时的持续时间,那么您 最终会得到错误的结果。

我没有找到任何关于如何使用 Joda-Time 实现这样一个周期的示例。

所以,我想动态获取每天包含的小时数,而不是像上面提到的那样用 24 小时硬编码。

【问题讨论】:

您没有告诉我们您要达到的目标,这让您很难理解您所说的“错误结果”是什么意思。 @JonSkeet- 我正在设置每天的总小时数,然后在图表中计算用户每天完成的工作量的值。这涉及到,用户在一天中的哪个时间做了哪些工作等。由于 DST 可能是 23 或 25 小时,因此结果不准确。 What I am trying to achieve? - 我想动态获取每天的小时数,而不是像问题中提到的那样用 24 小时硬编码。 您说“如问题中所述”,就好像我发表评论时它已经存在一样 - 它不是。 @JonSkeet - 好的。我认为我写的问题很明显。无论如何,谢谢。 【参考方案1】:

最简单的方法可能是使用类似的东西:

public int getHoursInDay(LocalDate date, DateTimeZone zone) 
    DateTime start = date.toDateTimeAtStartOfDay(zone);
    DateTime end = date.plusDays(1).toDateTimeAtStartOfDay(zone);
    return new Duration(start, end).getStandardHours();

编辑:如果您使用的 Joda Time 版本不支持 Duration.getStandardHours(),您可以使用:

public int getHoursInDay(LocalDate date, DateTimeZone zone) 
    DateTime start = date.toDateTimeAtStartOfDay(zone);
    DateTime end = date.plusDays(1).toDateTimeAtStartOfDay(zone);
    long millis = new Duration(start, end).getMillis();
    return (int) (millis / DateTimeConstants.MILLIS_PER_HOUR);

【讨论】:

上面写着The method getStandardHours() is undefined for the type Duration。方法getStandardSeconds() 在那里返回long 类型而不是int @VedPrakash:您使用的是哪个版本的 Joda Time?见joda.org/joda-time/apidocs/org/joda/time/…

以上是关于在 Joda Time 的帮助下使用夏令时的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

Joda-Time、夏令时更改和日期时间解析

Joda-Time,夏令时计算,时区独立测试

org.joda.time |夏令时 (DST) 和本地时区偏移

为啥这个 Joda 偏移不能正确实现夏令时

如何在 Joda Time 中检测模糊的 DST 重叠?

org.joda.time.DateTime 日期格式