Java Jodatime一天的开始和结束

Java Jodatime一天的开始和结束,java,android,jodatime,Java,Android,Jodatime,我想在本周开始和本周结束之间创建一个间隔 我有以下代码,借用自: private LocalDateTime calcNextSunday(LocalDateTime d){ if(d.getDayOfWeek()>DateTimeConstants.SUNDAY){ d=d.plusWeeks(1); } 返回d.withDayOfWeek(DateTimeConstants.SUNDAY); } 专用LocalDateTime calcPreviousMonday(LocalDateTime

我想在本周开始和本周结束之间创建一个间隔

我有以下代码,借用自:

private LocalDateTime calcNextSunday(LocalDateTime d){
if(d.getDayOfWeek()>DateTimeConstants.SUNDAY){
d=d.plusWeeks(1);
}
返回d.withDayOfWeek(DateTimeConstants.SUNDAY);
}
专用LocalDateTime calcPreviousMonday(LocalDateTime d){
if(d.getDayOfWeek()
但是现在我希望周一
LocalDateTime
在00:00:00,周日
LocalDateTime
在23:59:59。我该怎么做呢?

怎么样:

private LocalDateTime calcNextSunday(LocalDateTime d) {
    return d.withHourOfDay(23).withMinuteOfHour(59).withSecondOfMinute(59).withDayOfWeek(DateTimeConstants.SUNDAY);
}

private LocalDateTime calcPreviousMonday(final LocalDateTime d) {
    return d.withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0).withDayOfWeek(DateTimeConstants.MONDAY);
}

您可以使用
withTime
方法:

 d.withTime(0, 0, 0, 0);
 d.withTime(23, 59, 59, 999);
与彼得的答案相同,但更短。

还有一个简单的方法是


d.millisOfDay().withMaximumValue()

对于那些来这里寻找“js joda”答案的人,根据你想要完成的任务,你有两个选择

选项1:您希望在同一时区开始一天

由于您已选择根据与时区相关的瞬间计算时间,因此应使用ZonedDateTime:

import { ZonedDateTime, LocalDate, ZoneId, DateTimeFormatter} from "js-joda";
import 'js-joda-timezone';

const nowInNewYorkCity = ZonedDateTime.now(ZoneId.of("America/New_York"))
const startOfTodayInNYC = nowInNewYorkCity.truncatedTo(ChronoUnit.DAYS);
console.log(startOfTodayInNYC.toString()) // Prints "2019-04-15T00:00-04:00[America/New_York]"
// And if you want to print it in ISO format
console.log(startOfTodayInNYC.format(DateTimeFormatter.ISO_INSTANT)) // "2019-04-14T04:00:00Z"
选项2:您知道您想要获得时间的确切日期

然后,您可以使用LocalDate之外的以下方法来导出您想要的相对时间(即ZoneDateTime):

    atStartOfDay(): LocalDateTime
    atStartOfDay(zone: ZoneId): ZonedDateTime
    atStartOfDayWithZone(zone: ZoneId): ZonedDateTime
选项3:我只想要瞬间发生的那一天

请注意,有了这段代码,您就得到了与您所在位置相关的日期。因此,对于纽约市的人来说,这是“2019-04-14”,而对于伦敦的人来说,这是“2019-04-15”(这太棒了!),因为时间的瞬间正好在伦敦的明天(“2019-04-15T00:00:05Z”)。假设你从纽约给伦敦的某个人打电话,那个伦敦人会说:“天哪,你为什么这么早给我打电话……已经过了午夜5秒了。”

参考资料:


我还认为,在实际的排他性结束之前用少量时间表示周末间隔是个坏主意。最好将“开始”视为“包含”,而将“结束”视为“独占”(在执行比较等操作时)。

使用Kotlin,您可以编写一个扩展函数:

fun DateTime.withTimeAtEndOfDay() : DateTime = this.withTime(23,59,59,999)
这将允许您编写:

d.withDayOfWeek(DateTimeConstants.SUNDAY).withTimeAtEndOfDay()

setXxx
by约定在Java中没有返回类型,因此不允许链接。这让人想起了构建器模式(它最初不适用于现有对象)。这使您可以将调用串在一起,而不是将它们全部放在不同的行上,并让您获得不可变对象的所有好处。我认为“模式”被称为“流畅的接口”-在我看来,在可读性和清晰性方面提供了很多好处。我在2006年编写了“with”动词,并在2011年进行了更新。不可变设置器在使用方式上与普通设置器有很大不同(必须使用返回值)。@TheRueger响应是最好的答案。这一个是正确的,但在当前答案中性能最差,因为它在每个withXXX方法中创建了许多对象。d、 millisOfDay()。具有最大值();是实现最佳可能方式的方法。也可以通过d获得一天的开始。WithTimeAtStarToDay()
WithTimeAtStarToDay()
不适用于
LocalDateTime
,但它适用于所有人。请记住,使用此方法,每天会丢失一毫秒。我建议使用
d.plusDays(1)。在那天结束时使用时间(0,0,0,0)
。最好使用
plusDays(1)。使用时间(0,0,0,0)
方法,正如@Feuermurmel指出的,因为它与闰秒一起工作,如2015-06-30T23:59:60注意节约日光。最好使用
d.millisOfDay().withMaximumValue()这应该是公认的答案,与其他答案相比,在性能方面是最好的(创建为DateTime的对象较少是不可变的)。带有MaximumValue文档的方法甚至说是完成问题的最佳方法
GetMaximumValue Total
有什么区别?从时间间隔的末尾减去一个“小单位”总是一个非常糟糕的主意。时间间隔包括其开始和结束。检查(日期)时间是否包含在您执行的间隔中:开始
begin = d
    // Go to previous or same Sunday
    .with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY))
    // Beginning of day
    .truncatedTo(ChronoUnit.DAYS)

end = d
    // Go to next Sunday
    .with(TemporalAdjusters.next(DayOfWeek.SUNDAY))
    // Beginning of day
    .truncatedTo(ChronoUnit.DAYS)
fun DateTime.withTimeAtEndOfDay() : DateTime = this.withTime(23,59,59,999)
d.withDayOfWeek(DateTimeConstants.SUNDAY).withTimeAtEndOfDay()