gpt4 book ai didi

java - 什么是计算 ISO 8601 周数的简单好方法?

转载 作者:太空狗 更新时间:2023-10-29 22:36:44 26 4
gpt4 key购买 nike

假设我有一个日期,即整数形式的年月日。什么是用于计算 ISO 8601 的好的(正确的)、简洁的和相当可读的算法? week number给定日期属于星期几?我遇到了一些真正可怕的代码,这让我认为肯定有更好的方法。

我想用 Java 来做这件事,但是任何一种面向对象语言的伪代码都可以。

最佳答案

tl;dr

LocalDate.of( 2015 , 12 , 30 )
.get (
IsoFields.WEEK_OF_WEEK_BASED_YEAR
)

53

……或者……

org.threeten.extra.YearWeek.from (
LocalDate.of( 2015 , 12 , 30 )
)

2015-W53

java.time

支持ISO 8601 week现在内置于 Java 8 及更高版本中,在 java.time 中框架。避免使用旧的和臭名昭著的麻烦 java.util.Date/.Calendar 类,因为它们已被 java.time 取代。

这些新的 java.time 类包括 LocalDate对于没有时间或时区的仅日期值。请注意,您必须指定时区才能确定“今天”,因为世界各地的日期不同时。

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );

或者按照问题中的建议指定年份、月份和日期。

LocalDate localDate = LocalDate.of( year , month , dayOfMonth );

IsoFields类根据 ISO 8601 标准提供信息,包括基于周的一年中的一周。

int calendarYear = now.getYear();
int weekNumber = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
int weekYear = now.get ( IsoFields.WEEK_BASED_YEAR );

接近一年的开始/结束时,基于周的年份可能与日历年相差 ±1。例如,请注意公历和 ISO 8601 日历在 2015 年底的区别:第 52 周和第 1 周变为第 52 周和第 53 周。

enter image description here

enter image description here

ThreeTen-Extra — YearWeek

YearWeek类将 ISO 8601 基于周的年份编号 周编号一起表示为一个对象。此类可在 ThreeTen-Extra 中找到项目。该项目为 Java 内置的 java.time 类添加了功能。

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
YearWeek yw = YearWeek.now( zoneId ) ;

根据日期生成YearWeek

YearWeek yw = YearWeek.from (
LocalDate.of( 2015 , 12 , 30 )
)

此类可以生成和解析标准 ISO 8601 格式的字符串。

String output = yw.toString() ;

2015-W53

YearWeek yw = YearWeek.parse( "2015-W53" ) ;

您可以提取周数或基于周的年份数。

int weekNumber = yw.getWeek() ;
int weekBasedYearNumber = yw.getYear() ;

您可以通过指定要在该周内找到的所需星期几来生成特定日期 (LocalDate)。要指定星期几,请使用 Java 8 及更高版本中内置的 DayOfWeek 枚举。

LocalDate ld = yw.atDay( DayOfWeek.WEDNESDAY ) ;

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

您可以直接与您的数据库交换java.time 对象。使用JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 什么是计算 ISO 8601 周数的简单好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/147178/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com