用乔达时间提取直到午夜的秒数



>我有两个时间戳。(开始和结束)可能会发生一个时间戳是从昨天开始的。如果发生这种情况,我想知道直到中午 12 点(直到一天切换到今天)之前的确切秒数,然后是其余的直到当前时间戳。也可能发生开始日期是几天前,然后我希望从一天到另一天的秒数直到今天。

我觉得这可以使用 joda 时间最有效地完成,但不知道如何完成。感谢

**Example**
Start: timestamp(yesterday 23.55)
End: timestamp(today 00.02)
Should Return:
 Date of yesterday: 300 seconds
 Date of today: 120 seconds.
Another example:
Start date: timestamp( day before yesterday 23.58)
End date: timestamp(00.02)
Should return:
 Date of day before yesterday: 120 seconds
 Yesterday: 86400 seconds
 Today: 120 seconds

像这样的东西?它可以正确处理 DST 切换期间没有午夜的时区。

private static void listSecondsPerDayBetween(DateTime from, DateTime to) {
    System.out.println(from.toString("yyyy-MM-dd HH:mm:ss") + " - " + to.toString("yyyy-MM-dd HH:mm:ss"));
    if (! from.isBefore(to))
        throw new IllegalArgumentException("Values are inverted: " + from + ", " + to);
    LocalDate date = from.toLocalDate().plusDays(1);
    DateTime nextMidnight = date.toDateTimeAtStartOfDay();
    DateTime prev = from;
    while (nextMidnight.isBefore(to)) {
        Seconds seconds = Seconds.secondsBetween(prev, nextMidnight);
        System.out.println("  " + prev.toString("yyyy-MM-dd") + "  " + seconds.getSeconds() + " seconds");
        prev = nextMidnight;
        date = date.plusDays(1);
        nextMidnight = date.toDateTimeAtStartOfDay();
    }
    Seconds seconds = Seconds.secondsBetween(prev, to);
    System.out.println("  " + prev.toString("yyyy-MM-dd") + "  " + seconds.getSeconds() + " seconds");
}

测试

listSecondsPerDayBetween(DateTime.parse("2016-01-31T23:55:00"),
                         DateTime.parse("2016-02-01T00:02:00"));
System.out.println();
listSecondsPerDayBetween(DateTime.parse("2016-02-01T09:45:00"),
                         DateTime.parse("2016-02-01T11:13:00"));
System.out.println();
listSecondsPerDayBetween(DateTime.parse("2016-03-11T23:55:00"),
                         DateTime.parse("2016-03-15T00:02:00"));

输出

2016-01-31 23:55:00 - 2016-02-01 00:02:00
  2016-01-31  300 seconds
  2016-02-01  120 seconds
2016-02-01 09:45:00 - 2016-02-01 11:13:00
  2016-02-01  5280 seconds
2016-03-11 23:55:00 - 2016-03-15 00:02:00
  2016-03-11  300 seconds
  2016-03-12  86400 seconds
  2016-03-13  82800 seconds
  2016-03-14  86400 seconds
  2016-03-15  120 seconds

请注意,由于夏令时,3 月 13 日的时间较短。

请注意,您不想要"午夜",而是想要"一天的开始" - 这是一个微妙的差异,但在某些时区,在某些日子里,没有午夜。

假设您的时间戳位于具有适当时区的DateTime实例中:

DateTime startOfDay = end.withTimeAtStartOfDay();
if (startOfDay.isAfter(start)) {
  // startOfDay is after start, meaning that start and end are on different days.
  Seconds secondsBeforeSod = Seconds.secondsBetween(start, startOfDay);
  Seconds secondsAfterSod = Seconds.secondsBetween(startOfDay, end);
}

最新更新