从特定日期检索星期日
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 date
(LocalTime
表示 time
,LocalDateTime
表示两者)
您只需添加日期与下周日之间的天数,这对应于 7-dayOfWeek
:
LocalDate date = LocalDate.of(2017, 9, 16);
LocalDate sundayNext = date.plusDays(7 - date.getDayOfWeek().getValue());
如果你是 Monday
,dayOfWeek
是 1,你下一个 sunday
在 (7-1) = 6 days
如果你是 Tuesday
,dayOfWeek
是 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(Date
、Calendar
和 SimpleDateFormat
)有 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
我正在尝试创建一个函数,我将在其中发送特定日期(例如 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 date
(LocalTime
表示 time
,LocalDateTime
表示两者)
您只需添加日期与下周日之间的天数,这对应于 7-dayOfWeek
:
LocalDate date = LocalDate.of(2017, 9, 16);
LocalDate sundayNext = date.plusDays(7 - date.getDayOfWeek().getValue());
如果你是 Monday
,dayOfWeek
是 1,你下一个 sunday
在 (7-1) = 6 days
如果你是 Tuesday
,dayOfWeek
是 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(Date
、Calendar
和 SimpleDateFormat
)有 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