如何获得一年中某一周的年份?

How to get the YEAR for week of year for a date?

我知道 Calendar.WEEK_OF_YEAR 可用于获取给定日期的 "week of year",但如何获取相应的年份?

我知道Week of Year is dependent on Locale. And I am mostly interested in a DIN 1355-1 / ISO 8601/德解的定义(但我不想让它成为修复实现)

因此 1 月 1 日可能属于:

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

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 8 或更高版本?

参考 to use Java's java.timeAPI.

否则(三思而后行!)请参阅我的原始答案以使用过时的 Java API 作为问题中的要求。


前 Java 8?

calendar.getWeekYear(); returns 2015 对于你给出的例子。

请参阅 API 有关 GregorianCalendar#getWeekYear() as well as week year 的文档。

供参考

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

returns

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

java.time

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

这些新的 java.time classes 包括 LocalDate for date-only value without time-of-day or time zone。请注意,您必须指定时区才能确定“今天”,因为世界各地的日期不同时。

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

IsoFields class 根据 ISO 8601 标准提供信息,包括 week-based 年的 week-of-year。

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

在一年的 beginning/ending 附近,week-based 年可能与 calendar-year 年相差 ±1。例如,请注意 2015 年底公历和 ISO 8601 日历之间的差异:第 52 周和第 1 周变为 52 和 53。