如何获得一年中某一周的年份?
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 日可能属于:
- 新年第(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.getYear
、date.getFirstDayOfWeek.getYear
或 date.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。
我知道 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 日可能属于:
- 新年第(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.getYear
、date.getFirstDayOfWeek.getYear
或 date.getLastDayOfWeek.getYear
Java 8 或更高版本?
参考
否则(三思而后行!)请参阅我的原始答案以使用过时的 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。