Java 获取基于月份的日期的上周日期范围
是的,所以我一直在试图弄清楚这一点,所以我想在这里得到一些帮助 考虑到当前日期所在的月份,我试图基于当前日期获取前一周的开始和结束日期 比如说,Java 获取基于月份的日期的上周日期范围,java,Java,是的,所以我一直在试图弄清楚这一点,所以我想在这里得到一些帮助 考虑到当前日期所在的月份,我试图基于当前日期获取前一周的开始和结束日期 比如说, CurrentDay = 01 April 2020(or any date btw 1 to 5) Output: 30 March 2020 - 31 March 2020, note, since current day is 1st day of month and not start day of week. CurrentDay =
CurrentDay = 01 April 2020(or any date btw 1 to 5) Output: 30 March 2020 - 31 March 2020, note, since current day is 1st day of month and not start day of week.
CurrentDay = 06 April 2020(or any date btw 6 to 12) Output: 01 April 2020 - 05 April 2020, note, since should consider days in current month only.
CurrentDay = 15 April 2020 Output: 06 April 2020 - 12 April 2020.
CurrentDay = 24 April 2020 Output: 13 April 2020 - 19 April 2020.
CurrentDay = 30 April 2020 Output: 20 April 2020 - 26 April 2020.
CurrentDay = 01 May 2020 Output: 27 April 2020 - 30 April 2020, note, since current day is 1st day of month.
CurrentDay = 01 June 2020(or any date btw 1 to 7) Output: 25 May 2020 - 31 May 2020, note, since curent day is already start day of week.
这就是我到目前为止所做的
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
c.setTime(sdf.parse("2020-04-01"));
System.out.println(c.getTime());
int i = c.get(Calendar.DAY_OF_WEEK) - c.getFirstDayOfWeek();
c.add(Calendar.DATE, -i - 7);
Date start = c.getTime();
c.add(Calendar.DATE, 6);
Date end = c.getTime();
System.out.println(start + " - " + end);
但我很确定,我在这里做错了什么,因为我无法得到预期的结果。有人能帮我一点忙吗
注:在我的语言环境中,一周从周一开始。以下解决方案可以在法语语言环境中使用WeekFields,因为周一是一周的开始:
private static void printPreviousWeekRange(LocalDate now) {
TemporalField fieldISO = WeekFields.of(Locale.FRANCE).dayOfWeek();
LocalDate prevWeekStart, prevWeekEnd;
int dom = now.getDayOfMonth();
DayOfWeek dow = now.getDayOfWeek();
if (dom < 7 && dow != DayOfWeek.MONDAY) {
prevWeekEnd = LocalDate.of(now.getYear(), now.getMonth(), 1).minusDays(1);
prevWeekStart = prevWeekEnd.with(fieldISO, 1);
} else {
prevWeekStart = now.minusDays(7).with(fieldISO, 1);
if (prevWeekStart.getMonth().getValue() < now.getMonth().getValue() && dom != 1) {
prevWeekStart = LocalDate.of(now.getYear(), now.getMonth(), 1);
}
prevWeekEnd = now.minusDays(7).with(fieldISO, 7);
}
System.out.println(now + ": start=" + prevWeekStart + ", end=" + prevWeekEnd);
}
private static void test() {
printPreviousWeekRange(LocalDate.of(2020, 4, 1));
printPreviousWeekRange(LocalDate.of(2020, 4, 2));
printPreviousWeekRange(LocalDate.of(2020, 4, 4));
printPreviousWeekRange(LocalDate.of(2020, 4, 5));
printPreviousWeekRange(LocalDate.of(2020, 4, 6));
printPreviousWeekRange(LocalDate.of(2020, 4, 7));
printPreviousWeekRange(LocalDate.of(2020, 4, 12));
printPreviousWeekRange(LocalDate.of(2020, 4, 15));
printPreviousWeekRange(LocalDate.of(2020, 4, 24));
printPreviousWeekRange(LocalDate.of(2020, 4, 30));
printPreviousWeekRange(LocalDate.of(2020, 5, 1));
printPreviousWeekRange(LocalDate.of(2020, 6, 1));}
这是我的两分钱
我的方法是制作一个代表一个月中这一周的课程——或者是一整周,或者是一周中的一部分变成另一个月时的一部分
它发生在方法的中:开始和结束日期是给定的日期
参数之前的星期一(或在)和之后的星期日(或在),但它们经过调整,因此开始和结束日期不会在另一个月内出现。使用previous()
和next()
,可以找到相邻的月份周
public class WeekOfMonth {
private final LocalDate start;
private final LocalDate end;
private WeekOfMonth(LocalDate start, LocalDate end) {
this.start = start;
this.end = end;
}
public static WeekOfMonth of(LocalDate date) {
LocalDate startOfWeek = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
LocalDate start = (startOfWeek.getMonthValue() == date.getMonthValue() ? startOfWeek : date.with(TemporalAdjusters.firstDayInMonth()));
LocalDate endOfWeek = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
LocalDate end = (endOfWeek.getMonthValue() == date.getMonthValue() ? endOfWeek : date.with(TemporalAdjusters.lastDayInMonth()));
return new WeekOfMonth(start, end);
}
public WeekOfMonth previous() {
return of(this.start.minusDays(1));
}
public WeekOfMonth next() {
return of(this.end.plusDays(1));
}
}
要查找本月的前一周,只需拨打
WeekOfMonth.of(yourDate).previous()
提示:如果您处理多个线程,则不建议使用SimpleDateFormat
。我认为您应该提及您使用的java版本。在java 6中,它们之间有很多变化,看看这里的答案,使用java.time
包中的类,例如LocalDate
和DayOfWeek
。您应该使用这些类,而不是过时的SimpleDateFormat
和Calendar
类。@mceponder:那很好。但不幸的是,所提供的答案都没有帮助解决全部问题。谢谢你的回答。但我可以看出,如果现在给出的答案是2020-04-07,那就错了。仅应为start=2020-04-01,end=2020-04-05。你能帮我吗?所以从4月6日到4月12日的范围,前一周必须是4月1日到4月5日,对吗?是的。你能告诉我怎么处理吗?非常感谢。
WeekOfMonth.of(yourDate).previous()