如何获取一个日期所在周的年份?

4
我知道Calendar.WEEK_OF_YEAR可以用于获取给定日期的“周数”,但如何获得相应的年份?
我知道年周数的定义取决于Locale,我主要感兴趣的是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.getYear或者date.getLastDayOfWeek.getYear

2个回答

3

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。例如,请注意公历和ISO 8601日历在2015年末的差异:第52周和第1周变为第52周和第53周。

enter image description here

enter image description here


2

Java 8 或更高版本?

参考 Basil Bourque 的回答,使用 Java 的 java.time API。

否则(请三思!)查看我的原始回答,使用此问题中要求的已过时的 Java API。


Java 8 之前的版本?

calendar.getWeekYear(); 返回你所给出的示例中的 2015

请参阅 API 文档,了解 GregorianCalendar#getWeekYear()周年份

供参考

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接