1

我想转换以下字符串:

private String cw = "35/19" 

成2个日期。

开始日期可以格式化为:

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

调用时返回:26.08.2019

LocalDate.parse(cw, startOfWeekFormat).atStartOfDay();

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

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

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

3 回答 3

6
LocalDateTime ldt=LocalDate.parse(cw, startOfWeekFormat)
                    .atStartOfDay()
                    .with(TemporalAdjusters.next(DayOfWeek.MONDAY));

演示:

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

输出:

2019-09-02T00:00
于 2020-08-28T08:46:56.870 回答
1

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

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

它可能看起来像这样:

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

像这样main用你的例子打印结果String

public static void main(String[] args) {
    String cw = "35/19";
    Map.Entry<LocalDate, LocalDate> calendarWeekStartAndEndDate
                                    = getStartAndEndOfCalendarWeek(cw);
    System.out.println(calendarWeekStartAndEndDate.getKey() 
            + " - " + calendarWeekStartAndEndDate.getValue());
}

会输出

2019-08-26 - 2019-09-02

DateTimeFormatter我知道这会为使用 your解析的结果增加一周String,但我认为涉及两个不同的解析器或解析操作不会比增加一周带来任何好处。

如果您想要连续两个日历周的开始,则添加一个额外的 day,如下所示:

LocalDate weekEnd = weekStart.plusWeeks(1).plusDays(1);

如果你想要 a LocalDateTime(如果你真的这样做的话,我不太清楚),你当然可以调整返回类型并.atStartOfDay()在解析时使用weekStart,加法将保持不变。

于 2020-08-28T08:56:07.323 回答
1

我更喜欢不需要在解析字符串的结果中添加额外天数的解决方案。就像格式化程序中已经包含“plus(8)”的解决方案一样。

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

我都赞成半开区间,所以我确实看到它在你的情况下是实用的。抱歉,这是不可能的。

链接: WolframMathWorld 中的半开区间

于 2020-08-30T18:07:53.920 回答