tl;博士
java.time.LocalDate.of( 2018 , Month.JANUARY , 23 )
.plusDays( 1 )
.getDayOfWeek() // Returns a `DayOfWeek` enum object such as `DayOfWeek.MONDAY`.
……和……
java.time.LocalDate.of( 2018 , Month.JANUARY , 23 )
.plusDays( 1 )
.getDayOfMonth() // Returns an integer number, 1-31.
java.time
现代方法使用 java.time 类取代了最早的 Java 和 Joda-Time 项目中遗留的日期时间类。 Joda-Time 和 java.time/JSR 310 都是由同一个人 Stephen Colebourne 领导的,因此它们的概念非常一致。
LocalDate
LocalDate 类表示没有时间和时区的仅日期值。
LocalDate start = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalDate stop = LocalDate.of( 2018 , Month.FEBRUARY , 4 ) ;
使用ChronoUnit 枚举可以轻松计算经过的天数。
long days = ChronoUnit.DAYS.between( start , stop ) ;
该计算是使用半开方法进行的,其中开头是包含,而结尾是排除。这种方法通常是定义时间跨度的明智方法。
我需要知道间隔内有哪些工作日 - 星期一、星期二等。
有一个类:DayOfWeek,enum 定义七个对象,一个用于一周中的每一天。 EnumSet 类是 Set 的高度优化实现,用于收集 DayOfWeek 对象。 Set 吸收/忽略重复项,因此我们最终会得到一个不同的集合。
final int countDaysInWeek = DayOfWeek.values().length ; // Seven days in a week.
Set< DayOfWeek > dows = EnumSet.noneOf( DayOfWeek.class ) ;
LocalDate ld = start ;
while ( ld.isBefore( stop ) ) {
dows.add( ld.getDayOfWeek() ) ; // Add each date’s day-of-week to our collection.
if ( dows.size() == countDaysInWeek ) { break ; } // Bail out of this loop after collecting all the days of the week.
ld = ld.plusDays( 1 ) ; // Increment to the next day, to setup the next loop. The java.time classes use immutable objects, so we are generating a fresh object here rather than modifying the original.
}
而且,我还想知道哪些 daysOfMonth - 1 日、2 日,或者例如仅 20 日 - 从 20 日到 23 日。
您可以收集月份中的日期,但我怀疑这就是您想要的。
List< Integer > dayOfMonthNumbers = new ArrayList<>() ;
LocalDate ld = start ;
while ( ld.isBefore( stop ) ) {
dayOfMonthNumbers.add( ld.getDayOfMonth() ) ;
ld = ld.plusDays( 1 ) ; // Increment to next date.
}
如果您转入另一个月份,您最终会得到如下列表:29 , 30 , 1 , 2。我怀疑您会发现使用 LocalDate 对象的集合而不是仅仅使用月份中的日期更有用。
List< LocalDate > dates = new ArrayList<>() ;
LocalDate ld = start ;
while ( ld.isBefore( stop ) ) {
dates.add( ld ) ;
ld = ld.plusDays( 1 ) ; // Increment to next date.
}
从那里您可以使用DateTimeFormatter 生成字符串来表示这些日期值。搜索 Stack Overflow 以获取更多信息,因为这已被多次介绍。
ThreeTen-Extra & LocalDateRange
提示:如果您将 ThreeTen-Extra 库添加到您的项目中,您可以使用 LocalDateRange 类来表示您的时间跨度。
LocalDateRange range = LocalDateRange.of( start , stop ) ;
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。