Java8时间API中的周表示

Java8时间API中的周表示,java,java-8,jodatime,java-time,Java,Java 8,Jodatime,Java Time,我想让一节课代表一年中的某一周——比如今天是11月29日,这正是2014年的第48周。因此,一个实施示例是: 导入java.time.Year; 公共课工作周{ 私人国际周编号; 私人年度; } 另一个概念是在“工作周”课程中只安排一周的周一约会,但我觉得这不够直观,我会经常使用“年数”中的“周” Java8时间API中是否有一个类最适合我的需求?或者,如果没有,建议采用什么方法?您需要指定一周的定义 一年一周的字符串表示形式 一个选项是字符串。ISO 8601标准从星期一开始,到星期天结束,

我想让一节课代表一年中的某一周——比如今天是11月29日,这正是2014年的第48周。因此,一个实施示例是:

导入java.time.Year;
公共课工作周{
私人国际周编号;
私人年度;
}
另一个概念是在“工作周”课程中只安排一周的周一约会,但我觉得这不够直观,我会经常使用“年数”中的“周”


Java8时间API中是否有一个类最适合我的需求?或者,如果没有,建议采用什么方法?

您需要指定一周的定义

一年一周的字符串表示形式 一个选项是字符串。ISO 8601标准从星期一开始,到星期天结束,一年的第一周是第一个包含星期四的星期四,因此一年有52或53周

该标准还以
YYYY Www
(或省略hypen,
yyyyywww
)的格式定义了字符串时间跨度,例如
2014-W07
。一周中的一天由一个数字表示,其中周一为1,周日为7,格式为
YYYY-Www-D
(或省略连字符,
yyyywwd
),例如
2014-W07-2
(一年中第七周的一个星期二)。
W
对于消除年-月之间的歧义非常重要,例如
2014-07
为2014年7月


java.time 内置于Java8和更高版本中的包的灵感来自Joda Time,但完全是重新设计的。看

在java.time中,
瞬间
是UTC时间轴上的一个时刻。应用时区(
ZoneId
)以获取
zoneDateTime
。使用
LocalDate
获取一个只包含日期的值,该值不包含一天中的任何时间和时区

请注意,与Joda time相比,在java.time中确定一天中的第一个时刻需要额外的步骤:我们必须通过
LocalDate
类调用其
atStartOfDay
方法

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
LocalDate firstDayOfThisWeek = now.toLocalDate ().with ( DayOfWeek.MONDAY );
LocalDate firstDayOfNextWeek = firstDayOfThisWeek.plusWeeks ( 1 );
ZonedDateTime thisWeekStart = firstDayOfThisWeek.atStartOfDay ( zoneId );
ZonedDateTime nextWeekStart = firstDayOfNextWeek.atStartOfDay ( zoneId );
不幸的是,java.time缺少Joda-time的
时间间隔的等价物

幸运的是,我们有一个扩展java.time的项目(310是的数量)。该库包括一个与java.time集成的类。该
Interval
类比Joda Time类更受限制,因为它只支持没有时区的
即时
对象(始终以UTC为单位)

注意:ThreeTen Extra项目保留更改其接口和/或实现的权利。虽然它的目的是保持现有的有用性,但它也可以作为最终可能合并到java.time中的类的实验性证明场。我很乐意使用三个额外的,但你必须作出自己的风险效益决定

// This next line requires adding the `ThreeTen Extra` library to your project.
Interval interval = Interval.of ( thisWeekStart.toInstant () , nextWeekStart.toInstant () );  // "Interval" is part of ThreeTen-Extra project, not built into Java 8.
转储到控制台

System.out.println ( "now: " + now + " thisWeekStart: " + thisWeekStart + " nextWeekStart: " + nextWeekStart + " interval: " + interval );
现在:2016-01-15T18:10:48.143-05:00[美国/蒙特利尔]本周开始:2016-01-11T00:00-05:00[美国/蒙特利尔]下一周开始:2016-01-18T00:00-05:00[美国/蒙特利尔]时间间隔:2016-01-11T05:00:00Z/2016-01-18T05:00:00Z

您可以确定ISO 8601标准定义的一年中的一周。请注意“基于周”的术语。在一年的开始或结束时,日期将在一个日历年内,而其ISO 8601周的年份可能为±1

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
int weekOfYear = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
int weekBasedYear = now.get ( IsoFields.WEEK_BASED_YEAR );
System.out.println ( "weekOfYear: " + weekOfYear + " of weekBasedYear: " + weekBasedYear );
周年份:第2周基准日期:2016年


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 然后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(
      YearWeek
      Class
      该项目有一个类。原始问题看起来像是要求一个
      YearWeek
      类。要将此类类添加到额外的三个类中。

      另一种可能性是使用我的库中的类。示例:

      CalendarWeek now = SystemClock.inLocalView().now(CalendarWeek.chronology());
      int actual = now.getWeek(); // 35 on 2016-08-29
      int max = now.getMaximum(CalendarWeek.WEEK_OF_YEAR); // 52 in year 2016
      

      这个类也被建模为日期间隔,可以转换为一个公共的
      DateInterval
      (从星期一到星期天),通过它的方法
      toFlexInterval()

      提供流支持。你的问题是什么?你的问题是什么?在我看来问题是什么“在java.time或其他类似的库中是否有一个类来表示一年中的一周?”。提到这一点可能有点晚了,但您的大部分答案与这个问题无关(JDBC等)。我认为如果你只回答特定的问题,并添加到的链接,在其中可以包含所有有用(但与问题无关)的信息,那么它将更具可读性和实用性。换句话说,你的答案的第一个版本比当前版本要好。
      CalendarWeek now = SystemClock.inLocalView().now(CalendarWeek.chronology());
      int actual = now.getWeek(); // 35 on 2016-08-29
      int max = now.getMaximum(CalendarWeek.WEEK_OF_YEAR); // 52 in year 2016