【问题标题】:How to get Date from Week Number, Year and dayOfWeek in java?java - 如何从Java中的周数、年份和dayOfWeek获取日期?
【发布时间】:2019-12-18 04:43:45
【问题描述】:

我有周数,它的当前年份和 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);

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

【问题讨论】:

    标签: java date


    【解决方案1】:

    不要添加天数到wkstart,而是再次使用with 来设置星期几。例如:

    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
    

    【讨论】:

    • @OleV.V.你是对的。为什么不WeekFields.ISO.weekBasedYear() 只是为了与其他字段保持一致?两者似乎差别很小……(我选择WeekFields.ISO是因为我不喜欢到处看到大写字母)
    • 我也不喜欢在我的代码中大喊大叫。 :-) 另外WeekFields.ISO 更适合修改,以防有人想以不同的方式定义周。
    【解决方案2】:

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

    org.threeten.extra.YearWeek

    Answer by Sweeper 看起来正确。但是有一个更专业的类。

    如果根据ISO 8601 definition of week 以周为单位的年份做大量工作,请使用ThreeTen-Extra 库中的YearWeek 类。该库为 Java 8 及更高版本中内置的 java.time 类添加了额外的功能。

    确定星期。

    YearWeek yearWeek = YearWeek.of( 2019 , 51 ) ;
    

    获取LocalDate 用于该周内的星期几。

    LocalDate localDate = yearWeek.atDay( DayOfWeek.MONDAY ) ;
    

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

    DayOfWeek dow = DayOfWeek.of( 1 ) ;  // 1 = Monday, 7 = Sunday.
    

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

    LocalDate localDate = YearWeek.of( 2019 , 51 ).atDay( DayOfWeek.of( 1 ) ) ;
     
    

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

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

    【讨论】:

      【解决方案3】:

      还取决于Locale

      请注意,一周的第一天Locale-dependent 例如英国是星期一,美国是星期天。根据ISO 8601 标准,现在是星期一。为了比较,请检查US calendarUK calendar。因此,日期会有所不同,如下例所示:

      import java.time.DayOfWeek;
      import java.time.LocalDate;
      import java.time.temporal.WeekFields;
      import java.util.Locale;
      
      public class Main {
          public static void main(String[] args) {
              // Test
              int weekNumber = 34;
              int year = 2021;
              
              System.out.println(getLocalDate(weekNumber, DayOfWeek.TUESDAY, year, Locale.UK));
              System.out.println(getLocalDate(weekNumber, DayOfWeek.TUESDAY, year, Locale.US));
              
              System.out.println(getLocalDate(weekNumber, DayOfWeek.SUNDAY, year, Locale.UK));
              System.out.println(getLocalDate(weekNumber, DayOfWeek.SUNDAY, year, Locale.US));        
          }
      
          static LocalDate getLocalDate(int weekNumber, DayOfWeek dow, int year, Locale locale) {
              return LocalDate.of(year, 2, 1)
                      .with(dow)
                      .with(WeekFields.of(locale).weekOfWeekBasedYear(), weekNumber);
          }
      }
      

      输出:

      2021-08-24
      2021-08-17
      2021-08-29
      2021-08-15
      

      ONLINE DEMO

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


      * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-17
        • 1970-01-01
        • 2020-12-14
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多