如何确定一年中的一周? 我尝试了以下代码:
Calendar sDateCalendar = new GregorianCalendar();
sDateCalendar.set(Integer.parseInt(sDateYearAAAA), Integer.parseInt(sDateMonthMM)-1, Integer.parseInt(sDateDayDD));
System.out.format("sDateCalendar %tc\n", sDateCalendar);
iStartWeek = sDateCalendar.getWeekYear();
System.out.println("iStartWeek "+iStartWeek+ " "+sDateCalendar.WEEK_OF_YEAR);
我获得: sDateCalendar lun apr 23 11:58:39 CEST 2012 iStartWeek 2012 3
虽然一年中正确的一周是17岁。有人可以帮助我吗?
答案 0 :(得分:18)
优雅的方式(不需要java.util.Calendar):
new SimpleDateFormat("w").format(new java.util.Date())
答案 1 :(得分:17)
您正在使用sDateCalendar.WEEK_OF_YEAR,这是静态整数WEEK_OF_YEAR,请参阅java.util.Calendar类的源代码:
public final static int WEEK_OF_YEAR = 3;
要获得周数,您应该使用:
sDateCalendar.get(Calendar.WEEK_OF_YEAR);
答案 2 :(得分:11)
您需要定义一周的年份。
请注意旧的java.util.Calendar类的周定义因Locale而异。
出于多种原因,您应该避免使用旧的java.util.Date/.Calendar类。而是使用新的java.time框架。
Java 8及更高版本附带java.time框架。灵感来自Joda-Time,由JSR 310定义,并由ThreeTen-Extra项目扩展。请参阅Tutorial。
以下是获得ISO 8601标准周的一些示例代码。
获取日期,因此需要一周,取决于时区。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
IsoFields
类定义了基于周的年份。我们可以要求:
WEEK_OF_WEEK_BASED_YEAR
)WEEK_BASED_YEAR
)。首先我们得到当前的日期时间。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
询问该日期时间对象,询问标准的基于周的年份。
int week = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
int weekYear = now.get ( IsoFields.WEEK_BASED_YEAR );
转储到控制台。
System.out.println ( "now: " + now + " is week: " + week + " of weekYear: " + weekYear );
现在:2016-01-17T20:55:27.263-05:00 [美国/蒙特利尔]是星期:2周,年:2016
有关详细信息,请参阅此类似问题:How to calculate Date from ISO8601 week number in Java
WeekFields
在java.time中,您还可以调用WeekFields
类,例如WeekFields.ISO.weekBasedYear()
。在Java 8或更高版本的更高版本(早期版本的Java 8中的某些bugs were fixed)中应该与IsoFields
具有相同的效果。
YearWeek
对于标准ISO 8601周,请考虑将ThreeTen-Extra库添加到项目中以使用YearWeek
类。
YearWeek yw = YearWeek.of( 2012 , 17 ) ;
答案 3 :(得分:1)
Calendar calendar = Calendar.getInstance(Locale.WHATEVER);
calendar.set(year, month, day);
calendar.get(Calendar.WEEK_OF_YEAR);
注意日历中的月份,因为它以 0 开头,或者最好使用 Calendar.WHATEVER_MONTH