在java9或Java10中是否有一种有效的方法来检查一个日期是否介于两个日期之间
给定日期是否介于其他两个日期之间(其中日期是使用dd-MM-yyyy格式手动创建的)在java9或Java10中是否有一种有效的方法来检查一个日期是否介于两个日期之间,java,date,intervals,java-9,java-10,Java,Date,Intervals,Java 9,Java 10,给定日期是否介于其他两个日期之间(其中日期是使用dd-MM-yyyy格式手动创建的) ##经典方法## 导入java.util.Date; 导入java.text.ParseException; 导入java.text.simpleDataFormat; 公共类日期测试{ 公共静态void main(字符串…参数){ 试一试{ SimpleDataFormat sdf=新的SimpleDataFormat(“dd-MM-yyyy”); sdf.setLenient(错误); 日期d1=sdf.
##经典方法##
导入java.util.Date;
导入java.text.ParseException;
导入java.text.simpleDataFormat;
公共类日期测试{
公共静态void main(字符串…参数){
试一试{
SimpleDataFormat sdf=新的SimpleDataFormat(“dd-MM-yyyy”);
sdf.setLenient(错误);
日期d1=sdf.parse(“2015年12月11日”);
日期d2=sdf.parse(“2015年12月15日”);
日期d3=sdf.parse(“2015年12月18日”);
如果(d2.与(d1)相比>=0){
如果使用java.time
(从Java8开始)将(d2.compareTo(d3):
LocalDateTime-dateToCheck=LocalDateTime.now();
LocalDateTime startDate=dateToCheck.minusHours(1);
LocalDateTime endDate=dateToCheck.plusDays(1);
布尔值isOnOrBetween=dateToCheck.compareTo(startDate)>=0&&dateToCheck.compareTo(endDate)在非常基本的级别上,类似于
LocalDate monday = LocalDate.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
LocalDate friday = monday.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
LocalDate today = LocalDate.now();
if ((friday.isAfter(today) || friday.equals(today))
&& (monday.isBefore(today) || monday.equals(today))) {
System.out.println("between");
}
我希望能有类似“interval”的东西,但显然我们还没有做到:/只是另一个版本的疯狂程序员回答:
LocalDate startDate = LocalDate.of(2018, Month.OCTOBER, 15);
LocalDate endDate = LocalDate.of(2018, Month.OCTOBER, 31);
LocalDate dateToCheck = LocalDate.of(2018, Month.OCTOBER, 20);
if (!dateToCheck.isBefore(startDate) && !dateToCheck.isAfter (endDate))
System.out.println("In between!");
流–datesUntil
和anyMatch
另一种解决方案是使用java.time
和Stream
仅考虑日期:
LocalDate dateToCheck = LocalDate.now();
LocalDate startDate = LocalDate.of(2018, 6, 22);
LocalDate endDate = dateToCheck.plusMonths(3);
boolean between = startDate.datesUntil(endDate.plusDays(1)).anyMatch(dateToCheck::equals);
if (between) {
System.out.println("between");
}
太长,读不下去了
LocalDateRange
ThreeTen额外项目为java中内置的java.time类添加了功能
在它的类中有两个表示时间跨度:
LocalDateRange
间隔
两者都有几种方便的比较方法,如邻接
,重叠
,以及包含
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*
classes
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些次要功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(不要使用
java.util.Date
。如果您使用的是java 8或更高版本,您应该使用java.time
API。@marstran可以与您共享代码。我找不到。谢谢。@yasin您有搜索引擎吗?无论如何,您可以启动(包括代码)。您的代码也可以工作吗?看起来很合理(除了使用过时且设计拙劣的Date
class)。如果不是,可能是因为日期
尽管其名称并不代表日期,但简单的解决方案是从java.time移动到LocalDate
。@程序员为了避免等于
检查,可以将其更改为如果(!today.isBefore(星期一)&!today.isAfter(星期五))
这是一个使用类型Interval
。但它使用的是Joda Time。@程序员:这似乎可以用,我会试试的,感谢它们是java.Time.Period
…你说“Interval”时有没有想过?@zlakad是的,我看了Period
,但它没有任何功能(我可以看到)这将允许我确定一个日期是否在它的范围内,至少可以说这是经典的。没有理由在Java 9或10中使用它(我个人不会在Java 1.4之后使用)。这很聪明,但比比较开始和停止日期要慢。我知道……但并不总是关于速度:)这是一个特殊的解决方案-但我想展示它。我确实喜欢它,但我建议您添加一个注释,说明它是一个有趣的替代方案,而不是推荐的实用解决方案。我觉得这并不自然,只是我的意见。无论如何,谢谢,看到它是一个选项很有趣。您的支票是“独家”的检查,当我在做“包含性”检查(不是批评,只是强调)时,情况并非如此。这个答案使用了一个常见的技巧,即使用“notbefore”表示“on或after”,类似地,使用“notafter”表示“before或on”。因此,它会检查日期是否在包含范围内。它会给出与您的答案相同的结果。@OleV.V.我将接受更正,但我会说,可读性受到影响:PLike希望看到JDK的这一部分,因为它没有用处或任何东西@MadProgrammer澄清:这个答案没有显示“JDK的一部分”,但建议使用JDK之外的外部库,其方式与任何其他支持间隔的java库相同。注意:建议的类LocalDateRange
支持标准独占结束日期(在日历日期的世界中这很奇怪),并且只能通过黑客方法接受包含日期(使用工厂方法关闭(…)
)。我个人觉得是在之前
和是在之后
比从比较
中解读数值结果更清晰。然后,程序员再次用这些方法误读厄立特里亚人的答案,可能没有人会误读=
。
。所以这个答案也有它的优点。还有你的va变量名,isOnOrBetween
,信息量很大。@OleV.V.我也在考虑使用isBefore
和isAfter
。因为问题是关于包含中间值的
LocalDate monday = LocalDate.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
LocalDate friday = monday.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
LocalDate today = LocalDate.now();
if ((friday.isAfter(today) || friday.equals(today))
&& (monday.isBefore(today) || monday.equals(today))) {
System.out.println("between");
}
LocalDate startDate = LocalDate.of(2018, Month.OCTOBER, 15);
LocalDate endDate = LocalDate.of(2018, Month.OCTOBER, 31);
LocalDate dateToCheck = LocalDate.of(2018, Month.OCTOBER, 20);
if (!dateToCheck.isBefore(startDate) && !dateToCheck.isAfter (endDate))
System.out.println("In between!");
LocalDate dateToCheck = LocalDate.now();
LocalDate startDate = LocalDate.of(2018, 6, 22);
LocalDate endDate = dateToCheck.plusMonths(3);
boolean between = startDate.datesUntil(endDate.plusDays(1)).anyMatch(dateToCheck::equals);
if (between) {
System.out.println("between");
}
LocalDateRange
.of(
LocalDate.of( 2018 , 1 , 23 ) ,
LocalDate.parse( "30-03-2018" , DateTimeFormatter.ofPattern( "dd-MM-uuuu" )
)
.contains(
LocalDate.of( 2018 , Month.MARCH , 23 )
)