我想获取一周的开始和结束日期 例如
2012-05-06 至 2012-05-12
2012-05-13 至 2012-05-19
我写的代码是
currWeekCalender.add(Calendar.WEEK_OF_YEAR, 1);
String dateStart = currWeekCalender.get(Calendar.YEAR) + "-" + addZero((currWeekCalender.get(Calendar.MONTH) + 1)) + "-" + addZero(currWeekCalender.getFirstDayOfWeek());
currWeekCalender.add(Calendar.DAY_OF_MONTH,7);
String dateEnd = currWeekCalender.get(Calendar.YEAR) + "-" + addZero((currWeekCalender.get(Calendar.MONTH) + 1)) + "-" + addZero(currWeekCalender.get(Calendar.DAY_OF_MONTH));
但结果不正确,我也想要前几周的日期。
谢谢
各位程序员大家好:)
我正在开发一个小应用程序来从数据库中提取一些数据。要计算前几周的开始和结束日期,我使用以下代码:
// Calendar object
Calendar cal = Calendar.getInstance();
// "move" cal to monday this week (i understand it this way)
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
// calculate monday week ago (moves cal 7 days back)
cal.add(Calendar.DATE, -7);
Date firstDateOfPreviousWeek = cal.getTime();
// calculate sunday last week (moves cal 6 days fwd)
cal.add(Calendar.DATE, 6);
Date lastDateOfPreviousWeek = cal.getTime();
希望有帮助。
您的问题是
getFirstDayOfWeek()
返回一周的第一天;例如,美国周日,法国周一。 它不会返回该月中的某一天。 请参阅javadoc。
一个月中的第一天(即一周的开始)是(伪代码)
((7 + (firstDayOfWeek - dayOfWeek(firstOfMonth))) % 7) + 1
如果愿意,您可以将其翻译成
java.util.Calendar
代码,但我建议使用 Joda 时间。
我也想要前几周的日期。
add
currCalendar.add(Calendar.DAY_OF_MONTH, -7)
这可能涉及下溢,但
add
可以解决这个问题。
add(f, delta)
将 delta 添加到字段 f。这相当于调用
并进行两次调整:set(f, get(f) + delta)
添加规则 1。 调用后字段 f 的值减去调用前字段 f 的值是 delta,以字段 f 中发生的任何溢出为模。当字段值超出其范围时就会发生溢出,因此,下一个较大的字段会递增或递减,并且字段值会调整回其范围内。
这会打印前 10 周
final ZonedDateTime input = ZonedDateTime.now();
for(int i = 1; i < 10; i++) {
final ZonedDateTime startOfLastWeek = input.minusWeeks(i).with(DayOfWeek.MONDAY);
System.out.print(startOfLastWeek.format(DateTimeFormatter.ISO_LOCAL_DATE));
final ZonedDateTime endOfLastWeek = startOfLastWeek.plusDays(6);
System.out.println(" - " + endOfLastWeek.format(DateTimeFormatter.ISO_LOCAL_DATE));
}
java.time
2014 年 3 月,Java 8 引入了现代的
java.time
日期时间 API,取代了容易出错的遗留、java.util
日期时间 API。任何新代码都应使用 java.time
API。如果您收到 java.util.Date
的实例,请使用 java.time.Instant
将其转换为
Date#toInstant
,并根据您的要求从中派生 java.time
的其他日期时间类。
一周的第一天是特定于区域的,例如
DayOfWeek firstDowUk = WeekFields.of(Locale.UK).getFirstDayOfWeek();
DayOfWeek firstDowUs = WeekFields.of(Locale.US).getFirstDayOfWeek();
System.out.println(firstDowUk); // MONDAY
System.out.println(firstDowUs); // SUNDAY
因此,一周第一天的日期也会有所不同,例如
// ZoneId.systemDefault() returns the ZoneId set to the JVM executing the code
// Change it as per your requirement e.g. ZoneId.of("Europe/London")
LocalDate today = LocalDate.now(ZoneId.systemDefault());
LocalDate dateOnFirstDowUk = today.with(TemporalAdjusters.previousOrSame(firstDowUk));
LocalDate dateOnFirstDowUs = today.with(TemporalAdjusters.previousOrSame(firstDowUs));
System.out.println(dateOnFirstDowUk);
System.out.println(dateOnFirstDowUs);
LocalDate#minusWeeks
返回指定周数的日期,例如
// Go back by one week
System.out.println(dateOnFirstDowUk.minusWeeks(1));
System.out.println(dateOnFirstDowUs.minusWeeks(1));
演示:
public class Main {
public static void main(String[] args) {
DayOfWeek firstDowUk = WeekFields.of(Locale.UK).getFirstDayOfWeek();
DayOfWeek firstDowUs = WeekFields.of(Locale.US).getFirstDayOfWeek();
System.out.println(firstDowUk); // MONDAY
System.out.println(firstDowUs); // SUNDAY
// ZoneId.systemDefault() returns the ZoneId set to the JVM executing the code
// Change it as per your requirement e.g. ZoneId.of("Europe/London")
LocalDate today = LocalDate.now(ZoneId.systemDefault());
LocalDate dateOnFirstDowUk = today.with(TemporalAdjusters.previousOrSame(firstDowUk));
LocalDate dateOnFirstDowUs = today.with(TemporalAdjusters.previousOrSame(firstDowUs));
System.out.println(dateOnFirstDowUk);
System.out.println(dateOnFirstDowUs);
// Go back by one week
System.out.println(dateOnFirstDowUk.minusWeeks(1));
System.out.println(dateOnFirstDowUs.minusWeeks(1));
}
}
从 Trail:日期时间了解有关现代日期时间 API 的更多信息。