Java LocalDate 如何利用

Java LocalDate How to utilize

输入列表

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

我想知道如何获取两个日期之间的星期几。 谢谢

from date ex) 2020-10-01 to date 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.

了解有关 date-time API 的更多信息

java.time

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

    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 对象进行两项调整,以确保选择的周计划得到尊重。

如果您需要涵盖一个以上的日历月,请遍历这些月并对每个月执行相同的操作。还要检查结果日期是否在月份内,以便忽略月份边界附近的重复项。

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

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

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