【问题标题】:How to get the YEAR for week of year for a date?如何获得一年中一周的年份作为日期?
【发布时间】:2016-01-11 18:39:41
【问题描述】:

我知道Calendar.WEEK_OF_YEAR 可用于获取给定日期的“一年中的一周”,但如何获取相应的年份?

我知道Week of Year is dependentLocale上的定义。我最感兴趣的是 DIN 1355-1 / ISO 8601 / 德国解决方案(但我不想让它成为修复实现)

所以 1 月 1 日可能属于:

  • 新年第 (1) 年的第一周:例如 2015-01-01 是 2015 年第 1 周
  • 前一年 (53) 年的最后一周:例如 2016-01-01 在 2015 年的第 53 周

我的问题是今年如何获得?*

Date date =
Calender calendar = new GregorianCalendar(Locale.GERMAN)
calendar.setTime(date);

int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
int year       = ????                                             <------------

System.out.println(date + " is in " + weekOfYear + " of " + year);

* 解决方案不是:date.getYeardate.getFirstDayOfWeek.getYeardate.getLastDayOfWeek.getYear

【问题讨论】:

    标签: java date calendar


    【解决方案1】:

    java.time

    您应该使用 Java 8 及更高版本中内置的 java.time 框架。避免使用旧的和臭名昭著的 java.util.Date/.Calendar 类。

    这些新的 java.time 类包括 LocalDate 用于没有时间或时区的仅日期值。请注意,您必须指定一个时区来确定“今天”,因为世界各地的日期不同时。

    ZoneId zoneId = ZoneId.of ( "America/Montreal" );
    ZonedDateTime now = ZonedDateTime.now ( zoneId );
    

    IsoFields 类根据 ISO 8601 标准提供信息,包括以周为单位的一年中的一周。

    int calendarYear = now.getYear();
    int weekNumber = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
    int weekYear = now.get ( IsoFields.WEEK_BASED_YEAR );  // Answer to Question
    

    接近一年的开始/结束时,基于周的年份可能与日历年相差 ±1。例如,请注意 2015 年底的公历和 ISO 8601 日历之间的区别:第 52 周和第 1 周变为第 52 周和第 53 周。

    【讨论】:

      【解决方案2】:

      Java 8 或更高版本?

      参考Basil Bourque's answer使用Java的java.time API。

      否则(三思而后行!)请参阅我的原始答案,以使用此问题中提出的过时的 Java API。


      Java 8 之前的版本?

      calendar.getWeekYear(); 为您给定的示例返回 2015

      请参阅GregorianCalendar#getWeekYear()week year 的 API 文档。

      供参考

      Calendar calendar = new GregorianCalendar(Locale.GERMAN);
      calendar.set(2016, Calendar.JANUARY, 1, 0, 0, 0);
      Date date = calendar.getTime();
      
      int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
      int year       = calendar.getWeekYear();
      
      System.out.println(date + " is in " + weekOfYear + " of " + year);
      

      返回

      Fri Jan 01 00:00:00 CET 2016 is in 53 of 2015
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-31
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 2013-01-09
        相关资源
        最近更新 更多