如何在java中获得两个日期之间的工作日

bbmckpt7  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(632)

这个问题在这里已经有答案了

计算两个日期之间的工作日数(3个答案)
23天前关门了。
我的问题是,我需要获得用户将输入的两个日期之间的工作日。我不知道用什么来比较和得到天数,但这是我的代码。

// Scanner
    Scanner input = new Scanner(System.in);
    System.out.println("First date: ");
    String date1 = input.nextLine();
    System.out.println("Second date: ");
    String date2 = input.nextLine();
    input.close();

    // The format for the Date
    DateFormat formatDate = new SimpleDateFormat("dd/MM/yyyy");

    // Conver String to Date
    Date date_1 = formatDate.parse(date1);
    Date date_2 = formatDate.parse(date2);

    // Calendar
    Calendar calendar = Calendar.getInstance();

    // Date to Calendar
    calendar.setTime(date_1);
    calendar.setTime(date_2);

现在我需要做些什么来在这两个日期之间安排工作日,我不知道怎么做

y1aodyip

y1aodyip1#

您可以将输入日期解析为 LocalDate 然后创建一个从开始日期到结束日期的循环,步骤为一天。在循环中,将不落在太阳或周六的日期添加到列表中。

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("First date: ");
        String strDate1 = input.nextLine();
        System.out.print("Second date: ");
        String strDate2 = input.nextLine();

        LocalDate date1 = LocalDate.parse(strDate1);
        LocalDate date2 = LocalDate.parse(strDate2);

        List<LocalDate> listBusinessDates = new ArrayList<>();
        for (LocalDate date = date1; !date.isAfter(date2); date = date.plusDays(1)) {
            DayOfWeek dayOfWeek = date.getDayOfWeek();
            if (!(dayOfWeek.equals(DayOfWeek.SATURDAY) || dayOfWeek.equals(DayOfWeek.SUNDAY))) {
                listBusinessDates.add(date);
            }
        }

        System.out.println(listBusinessDates);
    }
}

示例运行:

First date: 2020-11-23
Second date: 2020-12-13
[2020-11-23, 2020-11-24, 2020-11-25, 2020-11-26, 2020-11-27, 2020-11-30, 2020-12-01, 2020-12-02, 2020-12-03, 2020-12-04, 2020-12-07, 2020-12-08, 2020-12-09, 2020-12-10, 2020-12-11]

注意,api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。在trail:date-time了解有关现代日期时间api的更多信息。
注意:无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。

bprjcwpo

bprjcwpo2#

你最好使用 java.time 包裹。它们的设计比 Date , Calendar 以及 SimpleDateFormat . 下面是这些课程的问题。
您可以在两个给定日期之间的所有日期上创建流,然后过滤(保留)工作日。

LocalDate startDate = LocalDate.of(2012, 3, 7);
LocalDate endDate = LocalDate.of(2012, 6, 7);

// Static imports from java.time.DayOfWeek
final Set<DayOfWeek> businessDays = Set.of(
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
);

List<LocalDate> allDates =

    // Generate a stream with all dates between startDate
    // and endDate (the latter is exclusive)
    startDate.datesUntil(endDate)

        // Retain all business days.
        .filter(t -> businessDays.contains(t.getDayOfWeek()))

         // Collect them into a List.
        .collect(Collectors.toList());

请注意 datesUntil 方法从java开始就可用≥ 9如果您碰巧仍然使用Java8,则必须采取一些额外的步骤来代替 startDate.datesUntil(endDate) :计算这两个日期之间的天数,然后生成限制该天数的流。

long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate);
Stream.iterate(startDate, d -> d.plusDays(1))
    .limit(numOfDaysBetween)

相关问题