我希望能够得到一个正确的DateTime
,用于我可以用一小时和一分钟指定的NEXT事件。我也希望能够通过为那个小时和分钟指定相同的东西来做到这一点,但是对于(例如)星期三的下一次出现。
另外,请注意,如果当前分钟已经“开始”(我猜这意味着我们在那一分钟的00毫秒内),那么,我们再次需要找到“下一步” “那个时候的发生。
一个例子(例如)获取下一个上午10:34和下一个12:45 PM的星期三的日期时间,将非常感谢。
我怎样才能在Joda做到这一点?
答案 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)
Answer by Matt Ball对于Joda-Time来说是正确的。 Joda-Time的制造商已经表示我们应该尽快转移到Java 8及更高版本中构建的java.time框架。所以这里是为java.time重写的相同类型的代码。
DayOfWeek
枚举由于java.time构建在Java中,因此使用int
替换参数作为捆绑的枚举DayOfWeek
的星期几似乎是合理的。
另一个答案中的代码有一个主要问题:它隐含地取决于JVM的当前默认时区。即使在运行时(!),该默认值也可随时更改。最好始终指定预期/期望的时区。所以我在我们的方法中添加了另一个参数。
如果您指定的小时和分钟在夏令时(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
会带有指定的时区。