如何检查给定间隔的哪个星期和月份日由?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查给定间隔的哪个星期和月份日由?相关的知识,希望对你有一定的参考价值。
假设我有两个LocalDate对象,fromDate和toDate。我需要知道区间内的哪个星期几天 - 星期一,星期二等等。而且,我想知道哪些天还是第一天,第二天,或者,例如20日,从20到23。 Joda时间库中是否有任何有用的工具/方法可以帮助我?我不是在询问特定的算法,我可以自己编写,但我不确定Joda的功能 - 也许它已经有了我可以重用的东西。
这与我想的一样接近:
或者这样的事情(假设只有两个不同的月份):
public Boolean dayOfMonthExistInPeriod(final int dayOfMonth, final LocalDate from, final LocalDate until){
final DateMidnight tested = new DateMidnight(from.getYear(), from.getMonthOfYear(), dayOfMonth);
final DateMidnight tested2 = new DateMidnight(until.getYear(), until.getMonthOfYear(), dayOfMonth);
final Interval interval = new Interval(from.toDateMidnight(), until.toDateMidnight());
return interval.contains(tested) && interval.contains(tested2);
}
public static boolean isDayBetween(int dtc, DateTime from, DateTime to)
{
final int dayOfWeekFrom = from.dayOfWeek().get();
final int daysBetween = Days.daysBetween(from, to).getDays();
if (dtc >= dayOfWeekFrom && dtc <= (dayOfWeekFrom + daysBetween))
return true;
return false;
}
使用方法
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd");
final DateTime from = dtf.parseDateTime("2000-07-08");
final DateTime to = dtf.parseDateTime("2000-07-13");
boolean res = isDayBetween(from, to, DateTimeConstants.THURSDAY)
tl;dr
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.
}
并且,我想知道哪些天还有 - 第一天,第二天,或者,例如,仅限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 ) ;
About 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 driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
- Java SE 8,Java SE 9,以及之后 内置。 带有捆绑实现的标准Java API的一部分。 Java 9增加了一些小功能和修复。
- Java SE 6和Java SE 7 大部分java.time功能都在ThreeTen-Backport中反向移植到Java 6和7。
- Android 更高版本的android捆绑java.time类的实现。 对于早期的Android,ThreeTenABP项目采用ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…。
Th 以上是关于如何检查给定间隔的哪个星期和月份日由?的主要内容,如果未能解决你的问题,请参考以下文章 Java 8 LocalDate:确定每月的哪个星期一(第 1、第 2、第 3 等)