在 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 的帮助下使用夏令时的正确方法的主要内容,如果未能解决你的问题,请参考以下文章