[英]How can I build a list of days, months, years from a calendar object in Java?
[英]How can I get list of years, months and weeks in Java?
我正在尝试获取自纪元以来的年份列表,即 1970 、 1971、 1972、 1973 等到 2017 ,并根据月份和年份在此之后的 1 月 - 12 月列表生成周(基于周一至周五的工作日)。
如果一个月从星期四开始,即 2-2-2016
那么它应该返回 2-2-2016, 3-2-2016
一个用例是假设月末日是星期二,日期是 30-4-2016
那么我应该得到 29-4-2016, 30-4-2016
到目前为止,我只能从输入日期获得同一周的最后一个工作日,代码如下:
String Date = "06-04-2012";
DateTimeFormatter f = DateTimeFormatter.ofPattern("YYYY-MM-DD");
LocalDate ld = LocalDate.parse(Date, f);
LocalDate nextOrSameFriday = ld.with(TemporalAdjusters
.nextOrSame(DayOfWeek.FRIDAY));
String output = nextOrSameFriday.toString();
//String output = ld.format( f );
if (nextOrSameFriday.getMonthValue() != ld.getMonthValue()) {
nextOrSameFriday = ld.with(TemporalAdjusters
.nextOrSame(DayOfWeek.THURSDAY));
if (nextOrSameFriday.getMonthValue() == ld.getMonthValue())
return nextOrSameFriday.toString();
else if (nextOrSameFriday.getMonthValue() != ld.getMonthValue()) {
nextOrSameFriday = ld.with(TemporalAdjusters
.nextOrSame(DayOfWeek.WEDNESDAY));
if (nextOrSameFriday.getMonthValue() == ld.getMonthValue())
return nextOrSameFriday.toString();
else if (nextOrSameFriday.getMonthValue() != ld.getMonthValue()) {
nextOrSameFriday = ld.with(TemporalAdjusters
.nextOrSame(DayOfWeek.TUESDAY));
if (nextOrSameFriday.getMonthValue() == ld.getMonthValue())
return nextOrSameFriday.toString();
else
return Date;
}
}
}
选择月份和年份后,我希望执行以下操作:
查找本月的第一天
查找 MONTH 的第一个星期五
检查是周六还是周日,在 DATE 中添加 1 或 2
在第一个星期五添加 2 天以获得第二周的第一天。
添加 5 天以获得第 2 周星期五
同样一直持续到月底
与其试图解释,我认为编写代码片段更简单,它还提供了更高的精度:
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("d-M-uuuu");
public static void printWorkWeeksOfMonth(String date) {
LocalDate ld = LocalDate.parse(date, DATE_FORMAT);
LocalDate lastDayOfMonth = ld.with(TemporalAdjusters.lastDayOfMonth());
// find first working day of month; also first working day of first work week
LocalDate firstWorkingDay = ld.withDayOfMonth(1);
if (ld.getDayOfWeek() == DayOfWeek.SATURDAY || ld.getDayOfWeek() == DayOfWeek.SUNDAY) {
firstWorkingDay = firstWorkingDay.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
}
while (! firstWorkingDay.isAfter(lastDayOfMonth)) {
// find last working day of week beginning on firstWorkingDay
LocalDate lastWorkingDay = firstWorkingDay.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));
if (lastWorkingDay.isAfter(lastDayOfMonth)) {
// end work week at end of month
lastWorkingDay = lastDayOfMonth;
}
System.out.println(firstWorkingDay.format(DATE_FORMAT)
+ " through " + lastWorkingDay.format(DATE_FORMAT));
// find beginning of next work week
firstWorkingDay = firstWorkingDay.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
}
}
如果我将2-2-2016
输入上述方法,它会打印:
1-2-2016 through 5-2-2016
8-2-2016 through 12-2-2016
15-2-2016 through 19-2-2016
22-2-2016 through 26-2-2016
29-2-2016 through 29-2-2016
鉴于29-4-2016
它打印:
1-4-2016 through 1-4-2016
4-4-2016 through 8-4-2016
11-4-2016 through 15-4-2016
18-4-2016 through 22-4-2016
25-4-2016 through 29-4-2016
换句话说,该方法将date
所属月份的工作周打印到标准输出。 您可能希望更改方法以接受YearMonth
而不是String
因为它不使用确切日期。 或者您可能想要更改它,以便以某种方式使用确切的日期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.