我怎样才能得到给定日期在一年中的一周? 我尝试下面的代码:
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纶04月23日11时58分39秒CEST 2012 iStartWeek 2012 3
而一年中的正确一周为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);
优雅的方式(不需要java.util.Calendar中):
new SimpleDateFormat("w").format(new java.util.Date())
一个周的定义
您需要定义年度周的 - 。
- 一个常见的定义是每周#1 1月1日。
- 一些平均每周#1年举行的一周的第一天的第一个星期(如周日在美国)。
- 标准ISO 8601的意思是这周#1保持第一个星期四 ,和星期总是以周一开始。 一年可以有52或53周。 第一/最后一周可以有一个基于为期一周的年比历年不同。
要注意的是旧的java.util.Calendar类有一周的定义,通过不同区域设置 。
由于多种原因,你应该避免老java.util.Date/.Calendar类。 相反,使用新的java.time框架。
java.time
Java的8和更高版本自带的java.time框架。 灵感来自乔达时间 ,由JSR 310定义,并通过扩展ThreeTen-EXTRA项目。 请参见教程 。
下面是一些示例代码,以获得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 [美国/蒙特利尔]是周:weekYear的2:2016
欲了解更多信息,请参阅本类似的问题: 如何从Java中ISO8601周数计算日期
WeekFields
在java.time你也可以呼吁WeekFields
类,如WeekFields.ISO.weekBasedYear()
应该有同样的效果IsoFields
用Java 8或更高版本的更新版本(一些错误是固定在早期版本的Java 8中)。
YearWeek
对于标准ISO 8601周,考虑将ThreeTen-EXTRA库项目中使用的YearWeek
类。
YearWeek yw = YearWeek.of( 2012 , 17 ) ;