java得到一个星期的一周

fam*_*oro 12 java calendar

如何约会一年中的哪一周?我尝试了以下代码:

  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);
Run Code Online (Sandbox Code Playgroud)

我获得:sDateCalendar lun apr 23 11:58:39 CEST 2012 iStartWeek 2012 3

而一年中正确的一周是17.有人可以帮助我吗?

ver*_*age 18

您正在使用sDateCalendar.WEEK_OF_YEAR,这是静态整数WEEK_OF_YEAR,请参阅java.util.Calendar类的源代码:

public final static int WEEK_OF_YEAR = 3;
Run Code Online (Sandbox Code Playgroud)

要获得周数,您应该使用:

sDateCalendar.get(Calendar.WEEK_OF_YEAR);
Run Code Online (Sandbox Code Playgroud)

  • 小心使用 WEEK_OF_YEAR。它有惊喜 /sf/ask/322592931/ (2认同)

小智 18

优雅的方式(不需要java.util.Calendar):

new SimpleDateFormat("w").format(new java.util.Date())
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 14

一周的定义

您需要定义一年中的周.

  • 一个常见的定义是第1周有1月1日.
  • 有些人意味着第一周是第一周举行一周的第一天(例如美国的星期日).
  • 标准ISO 8601意思是第1周持有第一个星期四,而星期总是以星期一开始.一年可以有52或53周.第一周/最后一周可以具有与日历年不同的基于周的年份.

请注意,旧的java.util.Calendar类的周定义Locale而异.

出于多种原因,您应该避免使用旧的java.util.Date/.Calendar类.而是使用新的java.time框架.

java.time

Java 8及更高版本附带了java.time框架.灵感来自Joda-Time,由JSR 310定义,并由ThreeTen-Extra项目扩展.请参阅教程.

以下是获得ISO 8601标准周的示例代码.

获取日期,因此一周,取决于时区.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
Run Code Online (Sandbox Code Playgroud)

IsoFields课程定义了基于周的年份.我们可以要求:

首先,我们得到当前的日期时间.

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
Run Code Online (Sandbox Code Playgroud)

询问该日期时间对象,询问标准的基于周的年份.

int week = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
int weekYear = now.get ( IsoFields.WEEK_BASED_YEAR );
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println ( "now: " + now + " is week: " + week + " of weekYear: " + weekYear );
Run Code Online (Sandbox Code Playgroud)

现在:2016-01-17T20:55:27.263-05:00 [美国/蒙特利尔]周:周二:年:2016

有关详细信息,请参阅此类似问题:如何从Java中的ISO8601周数计算日期

WeekFields

在java.time中,您还可以调用WeekFields类,例如WeekFields.ISO.weekBasedYear().应该具有与IsoFieldsJava 8或更高版本的更高版本相同的效果(在早期版本的Java 8 中修复了一些错误).

YearWeek

对于标准ISO 8601周,请考虑将ThreeTen-Extra库添加到项目中以使用YearWeek该类.

YearWeek yw = YearWeek.of( 2012 , 17 ) ;
Run Code Online (Sandbox Code Playgroud)