java获取给定日期一年中的星期

ukdjmx9f  于 2023-03-11  发布在  Java
关注(0)|答案(4)|浏览(134)

我怎样才能得到一年中某个星期的日期?我试了下面的代码:

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,有人能帮帮我吗

xu3bshqb

xu3bshqb1#

TL;医生

对于从星期一开始且第一周包含日历年的第一个星期四的年-周defined by the ISO 8601标准,请使用ThreeTen-Extra库中的YearWeek类,该库为Java中内置的 java.time 类添加了功能。

org.threeten.extra.YearWeek
.from(
    LocalDate.of( 2012 , Month.APRIL , 23 ) 
)
.toString()

2012年第17周

周的定义

您需要定义一年中的星期。

  • 一个常见的定义是第一周是1月1日。
  • 一些平均周#1是一年中拥有该周第一天的第一周(如美国的星期日)。
  • ISO 8601的标准含义是that week # 1 holds the first Thursday,并且周始终以星期一开始。一年可以有52或53周。第一周/最后一周可以是与日历年不同的基于周的年。

请注意,旧的java.util.Calendar类对week的定义随Locale而变化。
出于多种原因,您应该避免使用旧的java.util.Date/.Calendar类,而是使用新的java.time框架。

java.时间

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- 17 T20:55:27.263-05:00[美洲/蒙特利尔]是星期:每周的2年:2016
有关详细信息,请参阅此类似问题:How to calculate Date from ISO8601 week number in Java

一米四分一秒

在java.time中,您还可以调用WeekFields类,例如WeekFields.ISO.weekBasedYear()。在Java 8或更高版本中,它与IsoFields具有相同的效果(在Java 8的早期版本中,有些bugs were fixed)。

YearWeek

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

YearWeek yw = YearWeek.of( 2012 , 17 ) ;

大约 *java.时间 *

java.time框架内置于Java 8及更高版本中,这些类取代了麻烦的旧legacy日期-时间类,如java.util.DateCalendarSimpleDateFormat
要了解更多信息,请参阅Oracle Tutorial。并搜索堆栈溢出以获取许多示例和解释。规范是JSR 310
Joda-Time项目(现在在maintenance mode中)建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用与JDBC 4.2兼容的JDBC driver或更高版本。不需要字符串,不需要java.sql.*类。Hibernate 5和JPA 2.2支持 java.time
从哪里获得java.time类?

*Java SE 8Java SE 9Java SE 10Java SE 11及更高版本-标准Java API的一部分,具有捆绑的实现。
*Java 9带来了一些次要特性和修复。
*Java SE 6Java SE 7

  • 大多数 java.time 功能都是在ThreeTen-Backport中向后移植到Java 6和7的。
  • Android
  • 更高版本的Android(26+)捆绑了 java.time 类的实现。
  • 对于早期的Android(〈26),一个称为 API desugaring 的过程带来了最初未内置到Android中的subset of the java.time功能。
  • 如果脱糖不能满足您的需求,ThreeTenABP项目会将ThreeTen-Backport(上面提到的)应用于Android。
yr9zkbsy

yr9zkbsy2#

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

new SimpleDateFormat("w").format(new java.util.Date())
2ekbmq32

2ekbmq323#

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

public final static int WEEK_OF_YEAR = 3;

要获取周数,应使用:

sDateCalendar.get(Calendar.WEEK_OF_YEAR);
y1aodyip

y1aodyip4#

Calendar calendar = Calendar.getInstance(Locale.WHATEVER);
calendar.set(year, month, day);
calendar.get(Calendar.WEEK_OF_YEAR);

请小心日历中的月份,因为它以0开头,最好使用日历。

相关问题