当前位置: 首页 > 知识库问答 >
问题:

正确处理作为字符串值的日期并进行比较

阎令
2023-03-14

在我的程序中,我有一堆表示日期的字符串,看起来像这样:

String someDate1 = "abcd-2020-02-19t10:23:31.180z";
String someDate2 = "xyz-2020-02-22t10:03:31.111z";
String someDate2 = "blablabla-2020-06-15t11:13:31.181z";

让我们以“某个日期1”为例,我已经设法修剪了这些字符串,所以我最终只有日期,例如:

System.out.println(someDate1.substring(someDate1.length() - 24).substring(0, 19));

输出:

2020-02-19t10:23:31

现在,我想确定输出的这个日期是否早于七天。

假设我将上面的字符串保存在一个列表中,所以我只想知道我的约会时间是否超过一周,比如:

public static void main(String[] args) {

    String someDate1 = "abcd-2020-02-19t10:23:31.180z";
    List<String> datesList = new ArrayList<>();
    datesList.add(someDate1);
    ...//adding others too

    datesList.forEach(date -> {
        if (isDateOlder(date)) {
            System.out.println(date + " - this is more than 7 days old, it has been more than a week!");
        }
        else {
            System.out.println(date + " - it has NOT been more than a week since this date!");
        }
    });
}


static boolean isDateOlder(String date) { 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
    String afterTrimming = date.substring(date.length() - 24).substring(0, 19).replace("t", "-");

    try {
        Date afterFormatParse = formatter.parse(afterTrimming);

        LocalDate weekAgo = LocalDate.now().minusDays(7); //cool thing you can do, but i'm not using it
        System.out.println("a week ago : " + weekAgo); //it seems useful but i don't really use it because I saw I can't compare "Date" with LocalDate

        long rn = new Date().toInstant().toEpochMilli();
        long weekInMillis = 604800000;
        long oneWeekAgo = rn - weekInMillis;


        if (afterFormatParse.toInstant().toEpochMilli() <= oneWeekAgo) {
            return true;
        }
        else {
            return false;
        }

    } catch (ParseException e) {
        e.printStackTrace();
    }


}

底线是,它是有效的,但这似乎非常幼稚/浪费,我相信有一个更聪明的方法。。。所以基本上我的主要问题是:

很遗憾,LocalDate没有“toDate()”方法,所以你可以在需要的时候比较这两种方法。最后,我在一个变量中使用了“固定历元”来表示一周,这很幼稚。我想知道你们是否有一种更漂亮的方法来表示日期减去LocalDate提供的一周,同时,还有一种相互比较的方法?

>

  • 注意:我也尝试过使用iSeav(),如下所示:

    后格式化解析。toInstant()。isBefore(LocalDate.now()。但是不能这样做,因为“LocalDate.now().minusDays(7)”是LocalDate类型,而不是即时类型,当使用Date时,我不再有“.minusDays(7)”功能

    注2:实际上,我的字符串有时以“add vvd sfsf-…”开头或者更多这就是为什么我要从头开始修剪

    谢谢。

  • 共有1个答案

    百里默
    2023-03-14

    2020-02-19t10:23:31.180z采用标准的ISO 8601日期格式,由Java8 Time API原生支持,因此无需使用自定义格式模式。

    因此,要检查过去的日期是否超过7天,直到小数秒,您可以这样做:

    static boolean isDateOlder(String dateStr) {
        Instant date = Instant.parse(dateStr.substring(dateStr.indexOf('-') + 1));
        Instant weekAgo = ZonedDateTime.now().minusDays(7).toInstant();
        return date.isBefore(weekAgo);
    }
    

    如果要忽略时间部分和时区偏移(仅比较日期部分),可以这样做:

    static boolean isDateOlder(String dateStr) {
        LocalDate date = LocalDate.parse(dateStr.substring(dateStr.indexOf('-') + 1),
                                         DateTimeFormatter.ISO_DATE_TIME);
        LocalDate weekAgo = LocalDate.now().minusDays(7);
        return date.isBefore(weekAgo);
    }
    

    要将输入中的UTC时区偏移量(例如,Z)调整为本地时区,然后比较纯日期(如果时区转换跨越午夜),可以这样做:

    static boolean isDateOlder(String dateStr) {
        LocalDate date = Instant.parse(dateStr.substring(dateStr.indexOf('-') + 1))
                                .atZone(ZoneId.systemDefault())
                                .toLocalDate();
        LocalDate weekAgo = LocalDate.now().minusDays(7);
        return date.isBefore(weekAgo);
    }
    

    或者更宽松地支持除Z以外的时区:

    static boolean isDateOlder(String dateStr) {
        LocalDate date = ZonedDateTime.parse(dateStr.substring(dateStr.indexOf('-') + 1))
                                      .withZoneSameInstant(ZoneId.systemDefault())
                                      .toLocalDate();
        LocalDate weekAgo = LocalDate.now().minusDays(7);
        return date.isBefore(weekAgo);
    }
    
     类似资料:
    • 因此,我正在研究如何用javascript中的字符串进行日期比较,我发现大量堆栈溢出的帖子说你不能这样做。 参考: 如何在JavaScript中比较两个字符串日期? 用JavaScript比较两个日期 然而,下面的代码本与您所期望的完全一样,只使用字符串,当其中一个是YYYY-MM-DD而另一个是yyyy/mm/dd时,它甚至可以工作。有谁能解释一下为什么这样做,为什么stack overflow

    • 问题内容: 我从API收到日期字符串,其格式为。 我目前正在使用正则表达式来验证字符串格式,这种方法可以正常工作,但是我可以看到某些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。即,例如。 PHP中是否有更好的方法来接收诸如这样的字符串,并确定该日期是否为该格式的有效日期? 问题答案: 您可以为此目的使用类: 测试用例:

    • 我从API接收一个日期字符串,它的格式为。 我目前正在使用正则表达式来验证字符串格式,它工作正常,但是我可以看到一些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。 在PHP中有没有更好的方法来获取字符串,例如,并判断它是否是格式的有效日期?

    • 我犯了一个错误,在数据库中将日期存储为VARCHAR,这里看起来是2018年12月2日,我使用carbon创建了一个变量来获取14天的当前日期。

    • 问题内容: 作业:剪刀石头布游戏。 我创建了一个枚举: 从中我想比较各种价值观来决定谁是计算机还是人。设置值就可以了,并且比较也可以正常工作(纸张覆盖岩石,岩石压碎剪刀,剪刀切碎纸张)。但是,我不能束手无策。只要有平局,该用户即被宣布为获胜者。 唉唉......废话......这将澄清:是一个具有价值,或。我无法用比较来,正如你可以看到下面,是铸造类型从我的。 我猜这是一个不等于或无法匹配的问题,

    • 问题内容: 所以我正在使用它根据每个字符的Unicode值与字符串进行字典顺序比较,并返回一个整数。这是一个代码示例。 在Java中比较日期是否错误? 在测试中,我没有遇到意外结果的情况。如果不是必须的话,我真的不想在字符串中创建Date对象,因为我是在一个长时间运行的循环中执行此操作的。 *根据下面的答案, *Ninja Edit Gleaning可以将日期与字符串进行比较,如果格式正确,则没有