用joda时间将秒数提取到午夜

时间:2016-02-01 22:00:02

标签: java jodatime

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

我觉得这可以使用joda时间最有效地完成,但无法弄清楚如何。 THX

**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

2 个答案:

答案 0 :(得分:2)

这样的东西?它正确处理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日的时间会缩短。

答案 1 :(得分:1)

请注意,你不想要“午夜”,你想要"start of day" - 这是一个微妙的区别,但在某些时区,在某些日子里,没有午夜。

假设您的时间戳位于具有适当时区的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);
}
相关问题