在java中获取下周和上一周的开始和结束日期

问题描述 投票:0回答:4

我想获取一周的开始和结束日期 例如

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));

但结果不正确,我也想要前几周的日期。

谢谢

java date calendar dayofweek
4个回答
4
投票

各位程序员大家好:)

我正在开发一个小应用程序来从数据库中提取一些数据。要计算前几周的开始和结束日期,我使用以下代码:

// 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();

希望有帮助。


2
投票

您的问题是

getFirstDayOfWeek()
返回一周的第一天;例如,美国周日,法国周一。 它不会返回该月中的某一天。 请参阅javadoc

一个月中的第一天(即一周的开始)是(伪代码)

((7 + (firstDayOfWeek - dayOfWeek(firstOfMonth))) % 7) + 1

如果愿意,您可以将其翻译成

java.util.Calendar
代码,但我建议使用 Joda 时间。


我也想要前几周的日期。

只需减去 7 天,也许可以使用

add

currCalendar.add(Calendar.DAY_OF_MONTH, -7)

这可能涉及下溢,但

add
可以解决这个问题。

add(f, delta)

将 delta 添加到字段 f。这相当于调用

set(f, get(f) + delta)
并进行两次调整:

添加规则 1。 调用后字段 f 的值减去调用前字段 f 的值是 delta,以字段 f 中发生的任何溢出为模。当字段值超出其范围时就会发生溢出,因此,下一个较大的字段会递增或递减,并且字段值会调整回其范围内。


1
投票

Java 8 版本

这会打印前 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));
}

0
投票

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 的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.