Jodatime开始一天和一天结束

时间:2012-02-05 21:41:32

标签: java android jodatime

我想创建一个星期开始和当周结束之间的间隔。

我有以下代码,借鉴this answer

private LocalDateTime calcNextSunday(LocalDateTime d) {
    if (d.getDayOfWeek() > DateTimeConstants.SUNDAY) {
        d = d.plusWeeks(1);
    }
    return d.withDayOfWeek(DateTimeConstants.SUNDAY);
}

private LocalDateTime calcPreviousMonday(LocalDateTime d) {
    if (d.getDayOfWeek() < DateTimeConstants.MONDAY) {
        d = d.minusWeeks(1);
    }
    return d.withDayOfWeek(DateTimeConstants.MONDAY);
}

但现在我希望星期一LocalDateTime在00:00:00,星期日LocalDateTime在23:59:59。我该怎么做?

6 个答案:

答案 0 :(得分:139)

您可以使用withTime方法:

 d.withTime(0, 0, 0, 0);
 d.withTime(23, 59, 59, 999);

与彼得的答案相同,但更短。

答案 1 :(得分:79)

也是一个简单的方法

d.millisOfDay().withMaximumValue();

答案 2 :(得分:23)

怎么样:

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);
}

答案 3 :(得分:1)

使用Kotlin,您可以编写扩展功能:

fun DateTime.withTimeAtEndOfDay() : DateTime = this.withTime(23,59,59,999)

这将允许您编写:

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

答案 4 :(得分:0)

对于那些来这里寻找“ js-joda”答案的人,您有两种选择,具体取决于您要完成的任务

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

由于您已选择基于与时区相关的即时时间来计算时间,因此应使用ZonedDateTime:

react-input-range

选项2:您知道要获取时间的确切日期

然后,您可以使用LocalDate之外的以下方法来得出您想要的相对时间(即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"

选项3:我只希望即时发生的日期

注意此代码,您将获得相对于您所处位置的信息。因此对于纽约市的人来说,它是“ 2019-04-14”,对于伦敦的人来说,它是“ 2019-04-15”(太好了!),因为时间的瞬间是在实际上是明天在伦敦(“ 2019-04-15T00:00:05Z”)。假装您是从纽约市打电话给伦敦的某人,伦敦人会说:“老兄,您为什么这么早给我打电话……已经是午夜5秒钟了。”

    atStartOfDay(): LocalDateTime
    atStartOfDay(zone: ZoneId): ZonedDateTime
    atStartOfDayWithZone(zone: ZoneId): ZonedDateTime

参考:https://js-joda.github.io/js-joda/class/src/LocalDate.js~LocalDate.html#instance-method-atStartOfDayWithZone

答案 5 :(得分:0)

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)

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