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
Java 检查月、日或年是否在两个日期范围内_Java_Date_Datetime_Java Time - Fatal编程技术网

Java 检查月、日或年是否在两个日期范围内

Java 检查月、日或年是否在两个日期范围内,java,date,datetime,java-time,Java,Date,Datetime,Java Time,我有一个字符串过滤器,只能接受3种日期格式-YYYY、YYYY-MM、YYYY-MM-DD 我想检查请求的字符串是否在两个日期范围内 比如说,我在一个记录中有两个日期瞬间-2010-05-01T00:00:00Z和2020-03-01TT23:59:59.99999Z 然后: 请求日期|范围结果 2018年|范围内 2010年|范围内 2009年|不在范围内 2018-03 |范围内 2010-02 |不在范围内 2010-05 |在范围内感谢Ole V.V.的更正 2012-01-05 |范围

我有一个字符串过滤器,只能接受3种日期格式-YYYY、YYYY-MM、YYYY-MM-DD

我想检查请求的字符串是否在两个日期范围内

比如说,我在一个记录中有两个日期瞬间-2010-05-01T00:00:00Z和2020-03-01TT23:59:59.99999Z

然后:

请求日期|范围结果

2018年|范围内

2010年|范围内

2009年|不在范围内

2018-03 |范围内

2010-02 |不在范围内

2010-05 |在范围内感谢Ole V.V.的更正

2012-01-05 |范围内

2020-03-01 |范围内

2020-04-01 |不在范围内

我使用Java time来检查一个日期是在给定日期之前还是之后,但在我的例子中,我有一个字符串可以是3种日期格式中的任意一种

我能想到的一个解决方案是,如果请求是YYYY,那么只检查它是否在两个日期的年份之间。如果请求是YYYY-MM,则检查它是否在两个日期的年和月之间。等等但我不知道如何让它工作


有人能帮你解决这个问题吗?

你可以创建自己的方法来检查你的日期是否有效,在你的问题中,你有三种不同的情况,日期只有年,或者日期只有年和月,或者完整的日期,在这种情况下,当你想解析只有年的日期时,你有一个小问题,我可以为您提供以下解决方案:

public static boolean isValid(String date, Instant start, Instant end) {
    LocalDate sld = start.atOffset(ZoneOffset.UTC).toLocalDate();
    LocalDate eld = end.atOffset(ZoneOffset.UTC).toLocalDate();
    try {
        LocalDate ld = LocalDate.parse(date);
        return ld.isAfter(sld) && ld.isBefore(eld);
    } catch (DateTimeParseException e) {}

    try {
        YearMonth ym = YearMonth.parse(date);
        return ym.isAfter(YearMonth.from(sld)) && ym.isBefore(YearMonth.from(eld));
    } catch (DateTimeParseException e) {}

    try {
        Year y = Year.parse(date);
        return y.isAfter(Year.from(sld)) && y.isBefore(Year.from(eld));
    } catch (DateTimeParseException e) {}
    return false;
}
这是一个

您可以创建自己的方法来检查您的日期是否有效。在您的问题中,您有三种不同的情况,日期只有年,或者日期只有年和月,或者完整日期。在这种情况下,当您想解析只有年的日期时,您遇到了一个小问题,我可以为您提供以下解决方案:

public static boolean isValid(String date, Instant start, Instant end) {
    LocalDate sld = start.atOffset(ZoneOffset.UTC).toLocalDate();
    LocalDate eld = end.atOffset(ZoneOffset.UTC).toLocalDate();
    try {
        LocalDate ld = LocalDate.parse(date);
        return ld.isAfter(sld) && ld.isBefore(eld);
    } catch (DateTimeParseException e) {}

    try {
        YearMonth ym = YearMonth.parse(date);
        return ym.isAfter(YearMonth.from(sld)) && ym.isBefore(YearMonth.from(eld));
    } catch (DateTimeParseException e) {}

    try {
        Year y = Year.parse(date);
        return y.isAfter(Year.from(sld)) && y.isBefore(Year.from(eld));
    } catch (DateTimeParseException e) {}
    return false;
}
这是一个

查看,特别是LocalDate、YearMonth和Year类。它们都有isBefore和isAfter方法。我认为您的示例不正确,请确认您的输入输出好吗?顺便说一下……您可能想了解定义时间跨度的半开放方法,其中开始是包含的,结束是独占的。这就消除了你在结束时的瞬间问题。2010在你的范围内吗?一年中有些是,有些不是。那么,它的一部分足够了吗?2020-03-01年也一样。一天中的一纳秒不是。你说2010-03在范围内是错误的吗?该范围直到2010-05年才开始。@AMagic我建议编辑您的问题并输入正确的信息:查看,特别是LocalDate、YearMonth和Year类。它们都有isBefore和isAfter方法。我认为您的示例不正确,请确认您的输入输出好吗?顺便说一下……您可能想了解定义时间跨度的半开放方法,其中开始是包含的,结束是独占的。这就消除了你在结束时的瞬间问题。2010在你的范围内吗?一年中有些是,有些不是。那么,它的一部分足够了吗?2020-03-01年也一样。一天中的一纳秒不是。你说2010-03在范围内是错误的吗?这个范围要到2010-05年才会开始。@AMagic我建议编辑您的问题并输入正确的信息:谢谢,YCH_L,我喜欢您的方法。我将使用您的逻辑,但可能需要做一些细微的更改。如果开始日期和结束日期不是即时的,但它们也是这3种YYYY、YYYY-MM、YYYY-MM-DD格式中的任意一种格式的两个字符串,您会有什么建议?是的,正是@AMagic,在一种模式下无法验证所有这三种格式,因为我是分步骤进行的,在第一步中,它将检查格式是否为yyyy-MM-dd,如果不起作用,它将移动到第二种情况yyy-MM,如果不起作用,它将移动到第三种情况,即当年的yyyy,如果没有人是正确的,则返回false。但是,当开始和结束日期也是字符串且不是即时的,您会怎么做?开始日期是2010,结束日期是2013-04,请求日期是2011-06-20,所以这是一个匹配。我应该在我的原始问题中添加这一点吗?@AMagic是的,当然,我的回答不包括这个具体案例,我建议创建一个新问题,澄清您想要涵盖的其他案例,并在您的新问题中提及问题和答案,我们将帮助您谢谢,YCH_L,我喜欢您的方法。我将使用您的逻辑,但可能需要做一些细微的更改。如果开始日期和结束日期不是即时的,但它们也是这3种YYYY、YYYY-MM、YYYY-MM-DD格式中的任意一种格式的两个字符串,您会有什么建议?是的,正是@AMagic,在一种模式下无法验证所有这三种格式,因为我是分步骤进行的,在第一步中,它将检查格式是否为yyyy-MM-dd,如果不起作用,它将移动到第二种情况yyy-MM,如果不起作用,它将移动到第三种情况,即当年的yyyy,如果没有人可以正确,则返回FALSE,但在开始和结束d时返回FALSE
吃的也是串的,不是瞬间的,你会怎么做?开始日期是2010,结束日期是2013-04,请求日期是2011-06-20,所以这是一个匹配。我应该在我的原始问题中添加这一点吗?@AMagic是的,当然,我的回答不包括这个具体案例,我建议创建一个新问题,澄清您想要涵盖的其他案例,并在新问题中同时提及问题和答案,我们将帮助您