我知道Calendar.WEEK_OF_YEAR
可以用来获取给定日期的“一年中的一周”,但是如何获得相应的年份呢?
我知道Week of Year is dependent上Locale
的定义。我最感兴趣的是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.getYear
,date.getFirstDayOfWeek.getYear
或date.getLastDayOfWeek.getYear
答案 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 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。