如何获得与下一小时,分钟相对应的DateTime?

时间:2012-01-05 20:27:06

标签: jodatime

我希望能够得到一个正确的DateTime,用于我可以用一小时和一分钟指定的NEXT事件。我也希望能够通过为那个小时和分钟指定相同的东西来做到这一点,但是对于(例如)星期三的下一次出现。

另外,请注意,如果当前分钟已经“开始”(我猜这意味着我们在那一分钟的00毫秒内),那么,我们再次需要找到“下一步” “那个时候的发生。

一个例子(例如)获取下一个上午10:34和下一个12:45 PM的星期三的日期时间,将非常感谢。

我怎样才能在Joda做到这一点?

2 个答案:

答案 0 :(得分:9)

这样的事情,因为“星期三下午10:34:”

DateTime getNextTimeOnDay(int dayOfWeek, int hourOfDay, int minuteOfHour)
{
    DateTime now = new DateTime();
    DateTime then = now
        .withDayOfWeek(dayOfWeek)
        .withHourOfDay(hourOfDay)
        .withMinuteOfHour(minuteOfHour)
        .withSecondOfMinute(0)
        .withMillisOfSecond(0);

    return then.isBefore(now) ? then.plusWeeks(1) : then;
}

DateTime nextWednesdayAtTenThirtyFour
    = getNextTimeOnDay(DateTimeConstants.WEDNESDAY, 10, 34);

// as of now, this is 2012-01-06T10:34:00.000-05:00

答案 1 :(得分:0)

java.time

Answer by Matt Ball对于Joda-Time来说是正确的。 Joda-Time的制造商已经表示我们应该尽快转移到Java 8及更高版本中构建的java.time框架。所以这里是为java.time重写的相同类型的代码。

DayOfWeek枚举

由于java.time构建在Java中,因此使用int替换参数作为捆绑的枚举DayOfWeek的星期几似乎是合理的。

时区

另一个答案中的代码有一个主要问题:它隐含地取决于JVM的当前默认时区。即使在运行时(!),该默认值也可随时更改。最好始终指定预期/期望的时区。所以我在我们的方法中添加了另一个参数。

DST调整

如果您指定的小时和分钟在夏令时(DST)等异常情况下,则会对java.time进行调整。请务必阅读文档以了解该行为,并确认其符合您的愿望/期望。

使用TemporalAdjustor中定义的next( dayOfWeek ) TemporalAdjustors(注意复数s)意味着我们将在下一天 在未来前进,从未过去。所以我们可以在return语句中删除三元测试。

public ZonedDateTime getNextTimeOnDay ( ZoneId zoneId, DayOfWeek dayOfWeek, int hourOfDay, int minuteOfHour ) {
    ZonedDateTime now = ZonedDateTime.now ( zoneId );
    ZonedDateTime then = now
            .with ( TemporalAdjusters.next ( dayOfWeek ) )
            .withHour ( hourOfDay )
            .withMinute ( minuteOfHour )
            .withSecond ( 0 )
            .withNano ( 0 );

    return then;
}

调用该方法的示例。

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime nextWednesdayAtTenThirtyFour = this.getNextTimeOnDay ( zoneId, DayOfWeek.WEDNESDAY, 10, 34 );

转储到控制台。

System.out.println ( nextWednesdayAtTenThirtyFour );
  

2016-01-20T10:34-05:00 [美国/蒙特利尔]

顺便说一下,您可能希望将方法使用的ZonedDateTime作为起始点而不是假设“现在”。这条路线可能更有用/更灵活,便于测试。如果您选择此路线,则无需传递ZoneId,因为传递的ZonedDateTime会带有指定的时区。