-2

输入列表

  1. 从日期前)2020-10-01
  2. 迄今为止 ex) 2020-10-30
  3. 列出 [星期几] 例如)[太阳,星期一....]
  4. 列表 [周] ex) [1,4,5]

我想知道如何在这两个日期之间获得一周中的特定日期。感谢。

4

3 回答 3

1

从日期 ex) 2020-10-01 到日期 ex) 2020-10-30

您的输入字符串已经是日期的 ISO8601 格式,因此可以在不DateTimeFormatter显式提供的情况下对其进行解析。为了以自定义格式(例如yyyy-MM-dd)获取输出字符串,您需要使用DateTimeFormatter.

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String inputStrDate = "2020-10-01";
        LocalDate date = LocalDate.parse(inputStrDate);

        String outputStrDate = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        System.out.println(outputStrDate);
    }
}

输出:

2020-10-01

但是,如果您的输入是其他格式,则需要使用DateTimeFormatter它来将其解析为日期对象。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Formatter for input string
        DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");

        String inputStrDate = "10-01-2020";
        LocalDate date = LocalDate.parse(inputStrDate, inputFormat);

        // Formatter for output string
        DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        String outputStrDate = date.format(outputFormat);
        System.out.println(outputStrDate);
    }
}

输出:

2020-10-01

从Trail: Date Time了解有关日期时间 API 的更多信息。

于 2020-09-18T10:27:49.733 回答
1
for(LocalDate d = fromDate; !d.isAfter(toDate); d = d.plusDays(1)) { // 일정 시작 ~ 끝 loop
        for (Integer wf : weekOfMonth) {
            for (Integer df : dayOfWeek) {
                offDay = d.with(fieldWeek, wf)
                        .with(fieldDay, df);

                
                if (d.getMonth() == offDay.getMonth() && !offDays.contains(offDay)) {
                    offDays.add(offDay);
                }
            }
        }
    }

很抱歉问错了问题。非常感谢你。

我已经做到了,但我研究了你的代码。

于 2020-09-22T00:57:17.577 回答
0

java.time

我也建议您使用现代 Java 日期和时间 API java.time 进行日期工作。我的镜头是:

    LocalDate fromDate = LocalDate.of(2020, Month.OCTOBER, 1);
    LocalDate toDate = LocalDate.of(2020, Month.OCTOBER, 30);
    List<DayOfWeek> daysOfWeek = List.of(DayOfWeek.SUNDAY, DayOfWeek.MONDAY);
    List<Integer> weeks = List.of(1, 4, 5);
    
    if (! YearMonth.from(fromDate).equals(YearMonth.from(toDate))) {
        throw new IllegalStateException("Covering more than one month is not yet supported");
    }
    
    WeekFields wf = WeekFields.SUNDAY_START;
    for (int week : weeks) {
        for (DayOfWeek dow : daysOfWeek) {
            LocalDate date = fromDate.with(wf.weekOfMonth(), week)
                    .with(wf.dayOfWeek(), dow.get(wf.dayOfWeek()));
            // Is date inside interval?
            if (! (date.isBefore(fromDate)  || date.isAfter(toDate))) {
                System.out.println(date);
            }
        }
    }

输出:

2020-10-18
2020-10-19
2020-10-25
2020-10-26

打印的日期是 10 月第 4 周和第 5 周的星期日和星期一,以美国方式定义星期从星期日开始(因为您在示例列表中首先提到星期日),第 1 周是 10 月 1 日的那一周。星期日和星期一没有打印第 1 周的数据,因为它们在 10 月 1 日之前,即 9 月。

考虑您需要哪个周计划。您可以使用例如WeekFields.ISOWeekFields.of(Locale.getDefault())

我首先找到星期,然后是星期几,因为对我来说这是自然的方式。我需要使用该WeekFields对象进行两次调整,以确保尊重所选的周计划。

如果您需要覆盖多个日历月,请迭代几个月并为每个月做同样的事情。还要检查结果日期是否在月份内,以便忽略月份边界附近的重复项。

于 2020-09-19T02:51:08.257 回答