首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定间隔时间内过午夜次数

如何确定间隔时间内过午夜次数
EN

Stack Overflow用户
提问于 2014-06-13 22:30:51
回答 2查看 308关注 0票数 2

我有一个欢乐时光的间隔,可以跨越好几天。计算过午夜次数的最佳方法是什么?

间隔可能从开始日期的午夜开始,也可能不从午夜开始,并且可能不到一天。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-14 10:06:10

在这里,我假设一个区间,它是半开的,包括开始,但不包括结束。首先,我使用LocalDate类型,以排除对日期差异的墙壁时间影响。

代码语言:javascript
复制
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的解决方案输出:

代码语言:javascript
复制
    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这样的本地类型的主要原因。这也是我在自己的库中放弃这种混合类型的几个原因之一(另一个原因是数据库中的直接存储缺少选项)。这些具有日期、时间和时区的通用类型比大多数用户认为的要有用得多。在大多数情况下,最好使用本地类型和全局类型,主要用于时区感知的转换目的。

票数 2
EN

Stack Overflow用户

发布于 2014-06-15 02:58:53

我想出了以下几点:

代码语言:javascript
复制
public int getCountOfMidnights(Interval i) {
    return Days.daysIn(i.withStart(i.getStart().withTimeAtStartOfDay())).getDays();
}

本质上,我将间隔的开始时间调整为一天开始的时间(通常是午夜),然后计算调整后的间隔中包含的完整天数。

不确定这是更好还是更糟糕的其他答案等待一些测试,所以我将留在这里,以防人们有意见。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24214614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档