如何在java中从周数、年和dayOfWeek获取日期?

Ebe*_*aac 8 java date

我有周数,它对应的年份和 dayOfWeek 数(即星期一为 1,星期二为 2,依此类推)。有没有办法在java中找到带有这些信息的日期?

以下是我在网上找到的一种方法。

int week = 51;
LocalDate wkstart = LocalDate.now().with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, week);
LocalDate mon = wks.plusDays(1);
LocalDate tue = wks.plusDays(2);
LocalDate wed = wks.plusDays(3);
LocalDate thu = wks.plusDays(4);
LocalDate fri = wks.plusDays(5);
LocalDate sat = wks.plusDays(6);
LocalDate wkend = wks.plusDays(7);
Run Code Online (Sandbox Code Playgroud)

但是后来意识到 wkstart 正在存储当前日期而不是一周的开始。
有没有更好的方法来做到这一点?

Swe*_*per 10

而不是添加天数wkstartwith再次使用来设置星期几。例如:

LocalDate date = LocalDate.now()
    .with(WeekFields.ISO.weekBasedYear(), 2018) // year
    .with(WeekFields.ISO.weekOfWeekBasedYear(), 51) // week of year
    .with(WeekFields.ISO.dayOfWeek(), DayOfWeek.MONDAY.getValue()); // day of week
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 6

tl;博士

LocalDate localDate = 
        YearWeek               // Represent an entire week of a week-based year per the ISO 8601 standard definition of a week.
        .of(                   // Instantiate a `YearWeek` object.
            2019 ,             // Specify the week-based year number, NOT the calendar year.
            51                 // Specify the week number, 1-52 or 1-53. 
        )
        .atDay(
            DayOfWeek.of( 1 )  // The value 1 yields a `DayOfWeek.MONDAY` object.
        )
;
Run Code Online (Sandbox Code Playgroud)

org.threeten.extra.YearWeek

Sweeper答案看起来是正确的。但是有一个更专业的课程。

如果这样做与每个基于为期一周的年周多的工作周的ISO 8601的定义,使用YearWeek中发现了类ThreeTen-EXTRA库。该库为 Java 8 及更高版本中内置的java.time类添加了额外的功能。

确定星期。

YearWeek yearWeek = YearWeek.of( 2019 , 51 ) ;
Run Code Online (Sandbox Code Playgroud)

LocalDate在该周内获取一周中的某天。

LocalDate localDate = yearWeek.atDay( DayOfWeek.MONDAY ) ;
Run Code Online (Sandbox Code Playgroud)

对于星期几,您应该DayOfWeek在代码中使用枚举对象,而不仅仅是整数。要从DayOfWeek周一至周日的原始号码 1-7 获取 ,请致电DayOfWeek.of( x )

DayOfWeek dow = DayOfWeek.of( 1 ) ;  // 1 = Monday, 7 = Sunday.
Run Code Online (Sandbox Code Playgroud)

把所有这些放在一起,我们得到了这个单线。

LocalDate localDate = YearWeek.of( 2019 , 51 ).atDay( DayOfWeek.of( 1 ) ) ;
 
Run Code Online (Sandbox Code Playgroud)

需要明确的是…… ISO 8601 对一周的定义是:

  • 第 1 周包含一年中的第一个星期四。
  • 周从星期一开始,到星期日结束。
  • 一年有 52 或 53 个完整的 7 天周。
  • 基于周的年份的第一周/最后一周可能包含前一个/下一个日历年的尾随/前导日。因此,这些天的日历年不同于基于周的年。