Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java9或Java10中是否有一种有效的方法来检查一个日期是否介于两个日期之间_Java_Date_Intervals_Java 9_Java 10 - Fatal编程技术网

在java9或Java10中是否有一种有效的方法来检查一个日期是否介于两个日期之间

在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.

给定日期是否介于其他两个日期之间(其中日期是使用dd-MM-yyyy格式手动创建的)

##经典方法##
导入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 ) 
)