如何获得一周的日期(我知道周数)?

Mel*_*lon 16 java

我知道一年中的周数,一周从星期日开始,然后是星期一,星期二......星期六.

既然我知道周数,那么通过使用Java代码获取特定周的日期的有效方法是什么?

bun*_*udi 43

如果您不想要外部库,只需使用日历.

SimpleDateFormat sdf = new SimpleDateFormat("MM dd yyyy");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.WEEK_OF_YEAR, 23);        
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(sdf.format(cal.getTime()));    
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,非常麻烦的日期时间类,例如 [`java.util.Date`](https://docs.oracle.com/javase/10/docs/api/java/util/Date.html)、[` java.util.Calendar`](https://docs.oracle.com/javase/10/docs/api/java/util/Calendar.html) 和 `java.text.SimpleDateFormat` 现在是 [legacy](https ://en.wikipedia.org/wiki/Legacy_system),被 [*java.time*](https://docs.oracle.com/javase/10/docs/api/java/time/package-summary .html) 类内置于 Java 8 及更高版本中。请参阅 [*教程* by Oracle](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)。 (4认同)

Mat*_*ulc 22

纯Java 8/java.time解决方案

基于:

final long calendarWeek = 34;
LocalDate desiredDate = LocalDate.now()
            .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, calendarWeek)
            .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要在另一年的一周之内,你可以使用`LocalDate.ofYearDay(year,50)`而不是`LocalDate.now()`.DayOfYear(在我的情况下为'50`)可以是随机的,但不应早于该年第一天`DayOfWeek.MONDAY`的数量. (4认同)

Alo*_*ard 11

您可以使用joda时间

int weekNumber = 10;
DateTime weekStartDate = new DateTime().withWeekOfWeekyear(weekNumber);
DateTime weekEndDate = new DateTime().withWeekOfWeekyear(weekNumber + 1);
Run Code Online (Sandbox Code Playgroud)


Arv*_*ash 9

java.time

日期java.util时间 API 及其格式化 APISimpleDateFormat已经过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *

另外,下面引用的是Joda-Time主页的通知:

请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了该项目。

解决方案:

第一步是找到一周的第一天,第二步,我们只需要迭代从此日期开始的所有 7 天。

请注意,一周的第一天Locale相关的,例如,英国是星期一,美国是星期日。根据ISO 8601标准,今天是星期一。为了进行比较,请检查美国日历英国日历

第一步演示:

import java.time.LocalDate;
import java.time.Year;
import java.time.temporal.WeekFields;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        // Test
        int weekNumber = 34;
        System.out.println(getFirstDayOfWeek(weekNumber, Locale.UK));
        System.out.println(getFirstDayOfWeek(weekNumber, Locale.US));
    }

    static LocalDate getFirstDayOfWeek(int weekNumber, Locale locale) {
        return LocalDate
                .of(Year.now().getValue(), 2, 1)
                .with(WeekFields.of(locale).getFirstDayOfWeek())
                .with(WeekFields.of(locale).weekOfWeekBasedYear(), weekNumber);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

2021-08-23
2021-08-15
Run Code Online (Sandbox Code Playgroud)

ONLINE DEMO

第二步demo:

import java.time.LocalDate;
import java.time.Year;
import java.time.temporal.WeekFields;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        // Test
        getAllDaysOfTheWeek(34, Locale.US).forEach(System.out::println);
    }

    static LocalDate getFirstDayOfWeek(int weekNumber, Locale locale) {
        return LocalDate
                .of(Year.now().getValue(), 2, 1)
                .with(WeekFields.of(locale).getFirstDayOfWeek())
                .with(WeekFields.of(locale).weekOfWeekBasedYear(), weekNumber);
    }

    static List<LocalDate> getAllDaysOfTheWeek(int weekNumber, Locale locale) {
        LocalDate firstDayOfWeek = getFirstDayOfWeek(weekNumber, locale);
        return IntStream
                .rangeClosed(0, 6)
                .mapToObj(i -> firstDayOfWeek.plusDays(i))
                .collect(Collectors.toList());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

2021-08-15
2021-08-16
2021-08-17
2021-08-18
2021-08-19
2021-08-20
2021-08-21
Run Code Online (Sandbox Code Playgroud)

ONLINE DEMO

Trail: Date Time了解有关现代日期时间 API *的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大多数java.time功能向后移植到 Java 6 和 7。如果您正在处理 Android 项目和 Android API level 仍然不符合 Java-8,请检查通过脱糖可用的 Java 8+ API以及如何在 Android 项目中使用 ThreeTenABP