【问题标题】:Correct way to use periods for daylight saving with the help of Joda Time在 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 - 好的。我认为我写的问题很明显。无论如何,谢谢。

标签: java android datetime jodatime dst


【解决方案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/…
猜你喜欢
  • 2021-01-20
  • 2013-01-28
  • 2016-02-01
  • 2014-05-19
  • 2012-10-16
  • 2011-04-29
  • 2012-08-30
  • 2011-12-27
  • 1970-01-01
相关资源
最近更新 更多