从特定日期检索星期日

Retrieve Sunday from a specific date

我正在尝试创建一个函数,我将在其中发送特定日期(例如 2017-09-16,它将 return 本周的星期日。

例如,如果我发送 2017-09-16 它必须 return 2017-09-17.

我尝试使用日历来做到这一点。

Calendar c = Calendar.getInstance();
c.setTime(yourDate);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);

这会 return 我是星期几,但我不知道如何将其转换为星期日。

您可以使用 LocalDate,即 Java 8 API for dateLocalTime 表示 timeLocalDateTime 表示两者)


您只需添加日期与下周日之间的天数,这对应于 7-dayOfWeek :

LocalDate date = LocalDate.of(2017, 9, 16);
LocalDate sundayNext = date.plusDays(7 - date.getDayOfWeek().getValue());

如果你是 MondaydayOfWeek 是 1,你下一个 sunday(7-1) = 6 days

如果你是 TuesdaydayOfWeek 是 2,你下一个 sunday(7-2) = 5 days

...

如果星期日是一周的最后一天,您可以用 7 减去当前星期几,并将结果添加到日期。

Calendar date = Calendar.getInstance();
date.set(2017, Calendar.SEPTEMBER, 16);
date.add(Calendar.DAY_OF_MONTH, 7 - (date.get(Calendar.DAY_OF_WEEK) - 1));

System.out.println(date.get(Calendar.DAY_OF_MONTH));    // prints "17"

但我建议使用 Java 8 new API 作为日期 LocalDate as suggested in 的答案。

要查找下一个星期日,请使用Java 8 LocalDate and either TemporalAdjusters.nextOrSame(...) or TemporalAdjusters.next(...)

LocalDate date = LocalDate.parse("2017-09-16");
date = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
System.out.println(date); // prints: 2017-09-17

考虑避免 Calendar 并使用更适合日期操作的 API。旧的 classes(DateCalendarSimpleDateFormat)有 lots of problems and design issues,它们将被新的 APIs 取代。

如果您正在使用 Java 8,请考虑使用 new java.time API. It's easier, less bugged and less error-prone than the old APIs.

如果您使用 Java 6 或 7,您可以使用 ThreeTen Backport, a great backport for Java 8's new date/time classes. And for Android, you'll also need the ThreeTenABP (more on how to use it ).

下面的代码适用于两者。 唯一的区别是包名称(在 Java 8 中是 java.time,在 ThreeTen Backport(或 Android 的 ThreeTenABP)中是 org.threeten.bp),但是 classes 和方法 names 相同。

首先您需要定义一周的第一天,如it's not the same in all countries。你可以使用 ISO 的定义(星期一是一周的第一天),所以你的代码将是这样的:

LocalDate date = LocalDate.of(2017, 9, 16);
// use ISO definition (Monday is the first day of week)
WeekFields wf = WeekFields.ISO;
LocalDate sundayInSameWeek = date
    // get the first day of this week
    .with(wf.dayOfWeek(), 1)
    // get next Sunday (or the same date, if it's already Sunday)
    .with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
System.out.println(sundayInSameWeek); // 2017-09-17

结果是2017-09-17。但是如果我使用不同的星期定义(比如美国的定义,星期日是一周的第一天):

LocalDate date = LocalDate.of(2017, 9, 16);
// use US's definition of week (Sunday is the first day of week)
WeekFields wf = WeekFields.of(Locale.ENGLISH);
LocalDate sundayInSameWeek = date ... // all the same code

结果会是2017-09-10,因为在美国,星期日是一周的第一天,所以"Sunday in the same week as 2017-09-17"确实是2017-09-10.


如果您只想下个星期日,不管星期定义如何,您可以只使用TemporalAdjusters class:

LocalDate date = LocalDate.of(2017, 9, 16);
LocalDate nextSunday = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); // 2017-09-17

如果你有 String 和日期,你可以直接将它解析为 LocalDate:

// creates 2017-09-16
LocalDate date = LocalDate.parse("2017-09-16");

你可以试试:

public static void main(String[] args) throws Exception {
    SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd");
    Date yourDate = sm.parse("2017-09-16");

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int day = c.get(Calendar.DATE);
    System.out.println(day);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
    c.set(Calendar.DATE, 8 - dayOfWeek + day);
    Date nextSunDate = c.getTime();

    System.out.println(yourDate);     //2017-09-16
    System.out.println(nextSunDate);  //2017-09-17 
}

如果你的日期是 2017-09-17 那么 nextSunDate 将是 2017-09-24