我正在尝试创建一个函数,我将发送一个特定日期(例如2017-09-16
,它将返回本周日。
例如,如果我发送2017-09-16
,则必须返回2017-09-17
。
我正在尝试使用日历。
Calendar c = Calendar.getInstance();
c.setTime(yourDate);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
这将在一周中的某一天返回给我,但我不知道如何将其转换为星期日。
答案 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。旧类(Date
,Calendar
和SimpleDateFormat
)包含lots of problems和design 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}
(LocalTime
为time
,LocalDateTime
为7-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='|')
答案 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