如何将日历周的开始和结束作为 LocalDateTime (java 8)

Spe*_*ius 1 java formatting date localdatetime

我想转换以下字符串:

private String cw = "35/19" 
Run Code Online (Sandbox Code Playgroud)

分成 2 个日期。

开始日期可以格式化为:

private final DateTimeFormatter startOfWeekFormat = new DateTimeFormatterBuilder()
   .appendPattern("ww/YY")
   .parseDefaulting(WeekFields.ISO.dayOfWeek(), 1)
   .toFormatter();
Run Code Online (Sandbox Code Playgroud)

调用时返回:26.08.2019

LocalDate.parse(cw, startOfWeekFormat).atStartOfDay();
Run Code Online (Sandbox Code Playgroud)

但我在本周结束时挣扎,这基本上是下周“36/19”的开始。

我尝试添加 plus 8 天,但这会引发异常:

private final DateTimeFormatter endOfWeekFormat = new DateTimeFormatterBuilder()
    .appendPattern("ww/YY")
    .parseDefaulting(WeekFields.ISO.dayOfWeek(), 8)
    .toFormatter();
Run Code Online (Sandbox Code Playgroud)

Arv*_*ash 5

LocalDateTime ldt=LocalDate.parse(cw, startOfWeekFormat)
                    .atStartOfDay()
                    .with(TemporalAdjusters.next(DayOfWeek.MONDAY));
Run Code Online (Sandbox Code Playgroud)

演示:

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;

public class Main {
    public static void main(String[] args) {
        String cw = "35/19";
        final DateTimeFormatter startOfWeekFormat = new DateTimeFormatterBuilder()
                                            .appendPattern("ww/YY")
                                            .parseDefaulting(WeekFields.ISO.dayOfWeek(), 1)
                                            .toFormatter();
        
        LocalDateTime ldt=LocalDate.parse(cw, startOfWeekFormat)
                            .atStartOfDay()
                            .with(TemporalAdjusters.next(DayOfWeek.MONDAY));
        System.out.println(ldt);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

2019-09-02T00:00
Run Code Online (Sandbox Code Playgroud)

  • @Spektakulatius - 一周有“7”天,因此您不能像您在问题中提到的那样添加“8”。您需要将“8”替换为“7”。另外,可以通过在我的答案中使用“.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));”来获得等效结果。我想提到的第二件事是,向“LocalDateTime”添加天数的惯用方法是使用“.plusDays(n)”。 (2认同)