kab*_*een 5 java jodatime java-8 java-time
我希望有一个班级代表一年中的特定一周 - 例如今天是11月29日,这正是2014年的第48周.因此,一个示例实现将是:
import java.time.Year;
public class WorkingWeek {
private int weekNumber;
private Year year;
}
Run Code Online (Sandbox Code Playgroud)
另一个概念是在WorkingWeek课程中只有一周的星期一约会,但我觉得它不太直观,我会经常使用一周的数字.
Java 8 Time API中是否有一个符合我要求的类?或者如果没有,建议的方法是什么?
Bas*_*que 10
您需要指定一周的定义.
一个选项是字符串.ISO 8601标准将一周定义为星期一开始,星期日结束,一年中的第一周是第一周包含星期四,导致一年52或53周.
该标准还以(或省略hypen )的格式定义了这个星期的时间跨度的字符串表示YYYY-Www,YYYYWww例如2014-W07.一周中的一天由星期一为1,星期日为7的数字表示,格式YYYY-Www-D(或省略连字符YYYYWwwD),例如2014-W07-2(一年中第7周的星期二).在W从去年一个月的歧义,如重要2014-07是的2014年7月.
Java 8及更高版本中内置的java.time包受Joda-Time的启发,但完全重新构建.请参阅教程.
在java.time中,a Instant是UTC时间轴上的一个时刻.应用时区(ZoneId)来获得ZonedDateTime.使用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 );
Run Code Online (Sandbox Code Playgroud)
不幸的是,java.time缺少相当于Joda-Time的Interval.
幸运的是,我们有ThreeTen Extra,这个扩展java.time的项目(310是定义java.time的JSR的数量).该库包含一个Interval与java.time集成的类.此类Interval比Joda-Time更受限制,因为它仅支持Instant没有时区的对象(始终以UTC格式).
注意:ThreeTen-Extra项目保留更改其接口和/或实现的权利.虽然它本身是有用的,但它也可以作为最终可以合并到java.time中的类的实验性试验场.我很乐意使用ThreeTen-Extra,但您必须自己做出风险收益决定.
// 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.
Run Code Online (Sandbox Code Playgroud)
转储到控制台.
System.out.println ( "now: " + now + " thisWeekStart: " + thisWeekStart + " nextWeekStart: " + nextWeekStart + " interval: " + interval );
Run Code Online (Sandbox Code Playgroud)
现在:2016-01-15T18:10:48.143-05:00 [美国/蒙特利尔] thisWeek开始时间:2016-01-11T00:00-05:00 [美国/蒙特利尔] nextWeek开始时间: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 );
Run Code Online (Sandbox Code Playgroud)
weekOfYear:2周基于年份:2016年
该java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*
从哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.
更新:Joda-Time项目现在处于维护模式,并建议迁移到java.time类.我将此部分保留为历史记录.
该乔达时间 2.5库提供的Interval类来表示时间的跨度,在时间上对特定时刻沿宇宙的时间表.每个时刻都由DateTime班级代表.
Joda-Time使用半开放[)方法来定义时间跨度.开头是包容性的,而结尾是独家的.这通常是处理这种时间跨度的最佳方式.搜索StackOverflow以获取许多示例和讨论.
Joda-Time使用ISO 8601周定义.此外,Joda-Time使用ISO 8601作为其默认值来解析和生成日期时间值的字符串表示.
DateTimeZone zone = DateTimeZone( "America/Montreal" );
// Get first moment of a Monday. Inclusive.
DateTime start = new DateTime( 2014, 11, 24, 0, 0, 0, zone ); // Handle exception thrown if occurring during a Daylight Saving Time gap.
DateTime stop = start.plusWeeks( 1 ); // First moment of following Monday. Exclusive.
Interval week = new Interval ( start, stop );
Run Code Online (Sandbox Code Playgroud)
搜索StackOverflow可以找到一周的第一个星期一的许多问题和答案.
LocalDate (日期只)虽然您很可能想要使用LocalDate对象(仅限日期,没有时间)来构建Interval.这将是明智和有用的.不幸的是,实现Interval只支持DateTime对象,而不是LocalDate.