如何获得一年中的一年中的一年?

时间:2016-01-11 18:39:41

标签: java date calendar

我知道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是年度第53年的一周 2015

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

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

2 个答案:

答案 0 :(得分:2)

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

请参阅GregorianCalendar#getWeekYear()的API文档以及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);

返回

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

答案 1 :(得分: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周和第5周。 1成为52&amp; 53。

enter image description here

enter image description here