从特定日期检索星期日

时间:2017-09-21 16:04:08

标签: java date calendar dayofweek

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

例如,如果我发送2017-09-16,则必须返回2017-09-17

我正在尝试使用日历。

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

这将在一周中的某一天返回给我,但我不知道如何将其转换为星期日。

5 个答案:

答案 0 :(得分:2)

要查找 next 星期日,请使用Java 8 LocalDate以及TemporalAdjusters.nextOrSame(...)TemporalAdjusters.next(...)

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

答案 1 :(得分:2)

考虑避免Calendar并使用适合日期操作的更好的API。旧类(DateCalendarSimpleDateFormat)包含lots of problemsdesign issues,并且它们将被新API替换。

如果您使用的是 Java 8 ,请考虑使用new java.time API。它更容易,less bugged and less error-prone than the old APIs

如果您使用的是 Java 6或7 ,则可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ,您还需要ThreeTenABP(更多关于如何使用它here)。

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

首先,你需要定义一周的第一天,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,因为在美国,星期日是一周的第一天,因此“2017-09-17同一周的星期日”确实{ {1}}。

如果您只想下周日,无论周定义如何,您都可以使用2017-09-10类:

TemporalAdjusters

如果您有LocalDate date = LocalDate.of(2017, 9, 16); LocalDate nextSunday = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); // 2017-09-17 日期,则可以直接将其解析为String

LocalDate

答案 2 :(得分:1)

您可以使用LocalDate date作为{8}的Java {8} (LocalTimetimeLocalDateTime7-dayOfWeek

你有责任在你的日期和下一个星期日之间添加错过的天数,这与LocalDate date = LocalDate.of(2017, 9, 16); LocalDate sundayNext = date.plusDays(7 - date.getDayOfWeek().getValue()); 相对应:

Monday

如果您是dayOfWeek,则sunday为1,而下一个(7-1) = 6 days位于Tuesday

如果您是dayOfWeek,则sunday为2,而下一个(7-2) = 5 days位于get_current

<强> ...

答案 3 :(得分:1)

在星期日是星期的最后一天的情况下,您可以从7减去当前星期几,并将结果添加到日期。

import csv
delimiter_type=';'

with open('file_name.csv', 'rb') as csv_file:
    spamreader = csv.reader(csv_file, delimiter=delimiter_type, quotechar='|')

但我建议按照LocalDate回答中的建议,将Java 8新API用于日期Hugo's

答案 4 :(得分:1)

您可以尝试:

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