我有一个欢乐时光的间隔,可以跨越好几天。计算过午夜次数的最佳方法是什么?
间隔可能从开始日期的午夜开始,也可能不从午夜开始,并且可能不到一天。
发布于 2014-06-14 10:06:10
在这里,我假设一个区间,它是半开的,包括开始,但不包括结束。首先,我使用LocalDate类型,以排除对日期差异的墙壁时间影响。
public int getCountOfMidnights(Interval interval) {
LocalDate start = interval.getStart().toLocalDate();
LocalDate end = interval.getEnd().toLocalDate();
int countOfMidnights = Days.daysBetween(start, end).getDays();
if (interval.getStart().toLocalTime().equals(LocalTime.MIDNIGHT)) {
countOfMidnights++;
}
return countOfMidnights;
}更新是因为OPs自己的答案:
我已经测试了他的代码,特别是“美国/圣保罗”时区的代码,该时区在2013年推出了夏令-10-20在午夜跳到了T01:00。
使用@GabrielBauman的解决方案输出:
DateTimeZone tz = DateTimeZone.forID("America/Sao_Paulo");
DateTime start = new DateTime(2013, 10, 20, 5, 0, tz);
DateTime end = new DateTime(2013, 10, 21, 0, 0, tz);
Interval interval = new Interval(start.withTimeAtStartOfDay(), end);
System.out.println(getCountOfMidnights(interval)); // 0!!!用我的解,正确的结果是1。还有另一个问题,如果一个间隔从午夜开始的话,还有另一个问题没有考虑(OP必须考虑这是否也应该计算在内)。在我看来,是的,也见我下面的评论)。
的结论:,我们基本上有一个只有约会的情况,当计数午夜。
因此,明智的做法是避免时间类型(如果可能的话)在内部包含时区(比如Joda-DateTime或JDK-GregorianCalendar或新的JSR-310中的ZonedDateTime ),因为这里的时间算法不太清晰(对于墙壁时间比较也是明智的)。这就是我使用像LocalDate这样的本地类型的主要原因。这也是我在自己的库中放弃这种混合类型的几个原因之一(另一个原因是数据库中的直接存储缺少选项)。这些具有日期、时间和时区的通用类型比大多数用户认为的要有用得多。在大多数情况下,最好使用本地类型和全局类型,主要用于时区感知的转换目的。
发布于 2014-06-15 02:58:53
我想出了以下几点:
public int getCountOfMidnights(Interval i) {
return Days.daysIn(i.withStart(i.getStart().withTimeAtStartOfDay())).getDays();
}本质上,我将间隔的开始时间调整为一天开始的时间(通常是午夜),然后计算调整后的间隔中包含的完整天数。
不确定这是更好还是更糟糕的其他答案等待一些测试,所以我将留在这里,以防人们有意见。
https://stackoverflow.com/questions/24214614
复制相似问题