如何从 java 中的两个日历日期获取数组中的日历日期列表

How to do get list of calendar dates in array from two calendar dates in java

我试图找出两个特定日期的日历日期列表。但是我只在同一年内得到不固定两个日期。

我做了什么:

    private ArrayList<Calendar> weekendList = null;
    public void findWeekendsList(long startDate, long endDate)
    {
        weekendList = new ArrayList();
        Calendar calendarStart = null;
        Calendar calendarEnd=null;

        calendarStart= Calendar.getInstance();
        calendarStart.setTimeInMillis(startDate);



        /*calendarEnd= Calendar.getInstance();
        calendarEnd.setTimeInMillis(endDate);
       */

        // The while loop ensures that you are only checking dates in the current year

       while(calendar.get(Calendar.YEAR) == Calendar.getInstance().get(Calendar.YEAR)){
            // The switch checks the day of the week for Saturdays and Sundays
            switch(calendar.get(Calendar.DAY_OF_WEEK)){
                case Calendar.SATURDAY:
                case Calendar.SUNDAY:

                    weekendList.add(calendar);
                    break;
            }

            // Increment the day of the year for the next iteration of the while loop
            calendar.add(Calendar.DAY_OF_YEAR, 1);
        }
    }

我有 102 个周末,从 1 月 9 日到 12 月 31 日,但我想从今天(2018 年 1 月 9 日)到明年(如 2019 年 1 月 9 日),arrayList 中的所有周末。

如果有人有任何想法,那对我会有很大帮助。

所以,您立即遇到了一些突出的问题...

  • 使用过时的 API。 Calendar 应该不惜一切代价避免,它很麻烦,笨拙而且很容易搞砸
  • 只要年份相同,while 循环就会循环,所以它完全忽略了 endDate
  • 因为 Calendar 是可变的,所以您生成的只是一个 List,其中包含相同的 date/time 值
  • 你的算法认为周末是 "Saturday" 或 "Sunday",而通常情况下,我会认为周末是 "Friday" 和 "Monday" 之间的时间- 不知道这是不是你故意的,但这对我来说很突出。

由于 Java 8 包含更新的 Date/Time API,您应该开始使用它。如果您不使用 Java 8+(我会问一些关于为什么不这样做的严肃问题),您应该使用更可靠的 API - 我想到了 JodaTime,但是有还有一个compatible back port of the Java 8 Date/Time for earlier JDK/JVMs

现在,说了这么多,我会做一些更像...

public List<LocalDate> findWeekendsBetween(long startTime, long endTime) {
    LocalDate startDate = LocalDate.ofEpochDay(startTime);
    LocalDate endDate = LocalDate.ofEpochDay(endTime);

    System.out.println("Starting from " + startDate);
    System.out.println("Ending at " + endDate);

    List<LocalDate> weekends = new ArrayList<>(25);
    while (startDate.isBefore(endDate) || startDate.equals(endDate)) {
        switch (startDate.getDayOfWeek()) {
            case SATURDAY:
                weekends.add(startDate);
                startDate = startDate.plusDays(2);
                break;
            default:
                startDate = startDate.plusDays(1);
        }
    }
    return weekends;
}

事实上,我什至会更改它,以便呼叫者需要向您传递 LocalDate 值...

public List<LocalDate> findWeekendsBetween(LocalDate startDate, LocalDate endDate) {

因为long是模棱两可的。

上述算法包含了startTimeendTime,并认为"weekend"是"Friday"和"Monday"之间的时间,所以它只会 return "Saturday" 值

然后你可以使用类似...

的方式来调用它
LocalDate startDate = LocalDate.now();
LocalDate endDate = startDate.plusMonths(1);

List<LocalDate> weekends = findWeekendsBetween(startDate.toEpochDay(), endDate.toEpochDay());
System.out.println("Found " + weekends.size() + " Saturday/Sundays");
for (LocalDate date : weekends) {
    System.out.println(date);
}

(如您所见,我懒得计算固定时间点,只需使用 LocalDate 并将其转换为 long 值)

在我的测试中打印出类似...

Starting from 2018-01-09
Ending at 2018-02-09
Found 4 Weekends
2018-01-13
2018-01-20
2018-01-27
2018-02-03

but you have only added Saturday, it has to be Sundays also.

是的,正如我所说,我让它只接受 Saturday,对我来说,一个周末包括 SaturdaySunday

只需将 SUNDAY 包含在 switch 语句中即可轻松修复...

switch (startDate.getDayOfWeek()) {
    case SATURDAY:
    case SUNDAY:
        weekends.add(startDate);
        break;
    default:
        startDate = startDate.plusDays(1);
}

I think, it might be 52*2=104 list size.

我没有测试一整年,我只检查了一个月的价值。您可以更改结束日期,例如...

LocalDate endDate = startDate.plusYears(1);