如何将日历周的开始和结束设置为LocalDateTime(Java8)

如何将日历周的开始和结束设置为LocalDateTime(Java8),java,date,formatting,localdatetime,Java,Date,Formatting,Localdatetime,我要转换以下字符串: private String cw = "35/19" 分为两次约会 开始日期的格式可以是: private final DateTimeFormatter startOfWeekFormat = new DateTimeFormatterBuilder() .appendPattern("ww/YY") .parseDefaulting(WeekFields.ISO.dayOfWeek(), 1) .toFor

我要转换以下字符串:

private String cw = "35/19" 
分为两次约会

开始日期的格式可以是:

private final DateTimeFormatter startOfWeekFormat = new DateTimeFormatterBuilder()
   .appendPattern("ww/YY")
   .parseDefaulting(WeekFields.ISO.dayOfWeek(), 1)
   .toFormatter();
调用时返回的时间:2019年8月26日

LocalDate.parse(cw, startOfWeekFormat).atStartOfDay();
但我很难在本周结束时,也就是下一周36/19的开始

我试图加上8天,但出现了一个例外:

private final DateTimeFormatter endOfWeekFormat = new DateTimeFormatterBuilder()
    .appendPattern("ww/YY")
    .parseDefaulting(WeekFields.ISO.dayOfWeek(), 8)
    .toFormatter();
演示:

输出:

演示:

输出:


另一个答案是增加一周,但方式不同:

我假设您总是想要日历周的开始日期和结束日期。您可以编写一个返回Map.Entry的方法,其中键是开始日期,值是结束日期

它可能是这样的:

public static Map.Entry<LocalDate, LocalDate> getStartAndEndOfCalendarWeek(String calendarWeek) {
    DateTimeFormatter startOfWeekFormatter = new DateTimeFormatterBuilder()
            .appendPattern("ww/YY")
            .parseDefaulting(WeekFields.ISO.dayOfWeek(), 1)
            .toFormatter();
    
    LocalDate weekStart = LocalDate.parse(calendarWeek, startOfWeekFormatter);
    LocalDate weekEnd = weekStart.plusWeeks(1);

    return new AbstractMap.SimpleEntry<LocalDate, LocalDate>(weekStart, weekEnd);
}
LocalDate weekEnd = weekStart.plusWeeks(1).plusDays(1);
将输出

2019-08-26 - 2019-09-02 我知道这会给使用DateTimeFormatter解析字符串的结果增加一周的时间,但我认为涉及两个不同的解析器或解析操作不会比添加一周带来任何好处

如果希望连续两个日历周的开始,则可以使添加内容再添加一天,如下所示:

public static Map.Entry<LocalDate, LocalDate> getStartAndEndOfCalendarWeek(String calendarWeek) {
    DateTimeFormatter startOfWeekFormatter = new DateTimeFormatterBuilder()
            .appendPattern("ww/YY")
            .parseDefaulting(WeekFields.ISO.dayOfWeek(), 1)
            .toFormatter();
    
    LocalDate weekStart = LocalDate.parse(calendarWeek, startOfWeekFormatter);
    LocalDate weekEnd = weekStart.plusWeeks(1);

    return new AbstractMap.SimpleEntry<LocalDate, LocalDate>(weekStart, weekEnd);
}
LocalDate weekEnd = weekStart.plusWeeks(1).plusDays(1);

如果你想要一个LocalDateTime(如果你真的想要的话,我不太清楚),你当然可以调整返回类型和使用。在开始解析weekStart时,添加的内容将保持不变。

另一个增加一周的答案,但方式不同:

我假设您总是想要日历周的开始日期和结束日期。您可以编写一个返回Map.Entry的方法,其中键是开始日期,值是结束日期

它可能是这样的:

public static Map.Entry<LocalDate, LocalDate> getStartAndEndOfCalendarWeek(String calendarWeek) {
    DateTimeFormatter startOfWeekFormatter = new DateTimeFormatterBuilder()
            .appendPattern("ww/YY")
            .parseDefaulting(WeekFields.ISO.dayOfWeek(), 1)
            .toFormatter();
    
    LocalDate weekStart = LocalDate.parse(calendarWeek, startOfWeekFormatter);
    LocalDate weekEnd = weekStart.plusWeeks(1);

    return new AbstractMap.SimpleEntry<LocalDate, LocalDate>(weekStart, weekEnd);
}
LocalDate weekEnd = weekStart.plusWeeks(1).plusDays(1);
将输出

2019-08-26 - 2019-09-02 我知道这会给使用DateTimeFormatter解析字符串的结果增加一周的时间,但我认为涉及两个不同的解析器或解析操作不会比添加一周带来任何好处

如果希望连续两个日历周的开始,则可以使添加内容再添加一天,如下所示:

public static Map.Entry<LocalDate, LocalDate> getStartAndEndOfCalendarWeek(String calendarWeek) {
    DateTimeFormatter startOfWeekFormatter = new DateTimeFormatterBuilder()
            .appendPattern("ww/YY")
            .parseDefaulting(WeekFields.ISO.dayOfWeek(), 1)
            .toFormatter();
    
    LocalDate weekStart = LocalDate.parse(calendarWeek, startOfWeekFormatter);
    LocalDate weekEnd = weekStart.plusWeeks(1);

    return new AbstractMap.SimpleEntry<LocalDate, LocalDate>(weekStart, weekEnd);
}
LocalDate weekEnd = weekStart.plusWeeks(1).plusDays(1);
如果你想要LocalDateTime,如果你真的想要,我不太清楚,你当然可以调整返回类型并使用.atStartOfDay解析weekStart时,添加内容将保持不变


我更喜欢不需要增加额外天数的解决方案 返回已解析字符串的结果。就像一个解决方案 plus8已包含在格式化程序中

这是不可能的。您无法将2020-08-30解析为2020-08-31或2020-09-30。同样,您也不能将2019年第36周的35/19解析为日期

我完全赞成半开放式间歇,所以我认为这在你的情况下是可行的。很抱歉,这是不可能的

链接:在WolframMathWorld


我更喜欢不需要增加额外天数的解决方案 返回已解析字符串的结果。就像一个解决方案 plus8已包含在格式化程序中

这是不可能的。您无法将2020-08-30解析为2020-08-31或2020-09-30。同样,您也不能将2019年第36周的35/19解析为日期

我完全赞成半开放式间歇,所以我认为这在你的情况下是可行的。很抱歉,这是不可能的


链接:在WolframathWorld中。

你必须直接获得一个日历周的结束时间吗?如果没有,您可以简单地在开始处添加一周,这可以成功解析…您是否必须直接获得日历周的结束?如果没有,您可以简单地在开始处添加一周,这可以成功地解析…我更喜欢一个解决方案,在该解决方案中,我不需要向解析字符串的结果添加额外的天数。就像一个解决方案,其中plus8已经包含在格式化程序中。@Spektakulatius-一周有7天,因此您不能像您在问题中提到的那样添加8天。你需要把8换成7。此外,还可以使用.With TemporalAdjusters.nextDayOfWeek.SUNDAY;在我的回答中。我想提到的第二件事是,向LocalDateTime添加天数的惯用方法是使用.plusDaysn。我更喜欢不需要向解析字符串的结果添加额外天数的解决方案。就像一个解决方案,其中plus8已经包含在格式化程序中。@Spektakulatius-一周有7天,因此您不能像您在问题中提到的那样添加8天。你需要把8换成7。此外,还可以使用.With TemporalAdjusters.nextDayOfWeek.SUNDAY;在我的回答中。我想提到的第二件事是,向LocalDateTime添加天数的惯用方法是使用.plusDaysn。