如何从 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
是模棱两可的。
上述算法包含了startTime
和endTime
,并认为"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
,对我来说,一个周末包括 Saturday
和 Sunday
。
只需将 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);
我试图找出两个特定日期的日历日期列表。但是我只在同一年内得到不固定两个日期。
我做了什么:
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
是模棱两可的。
上述算法包含了startTime
和endTime
,并认为"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
,对我来说,一个周末包括 Saturday
和 Sunday
。
只需将 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);