Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取基于月份的日期的上周日期范围_Java - Fatal编程技术网

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()