正确处理以字符串值形式出现的日期,并对它们进行比较。

问题描述 投票:0回答:1

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

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

现在,我想确定输出处的这个日期是否超过7天。

比方说,我把上面的字符串保存在一个列表中,所以我想要的只是简单地知道我的日期是否超过一周之类的东西。

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提供的那样,用更漂亮的方法来表示一个日期减去一个星期,同时,也可以在两者之间进行比较?

  • 注。 我还尝试了isBefore(),比如:

    afterFormatParse.toInstant().isBefore(LocalDate.now().minusDays(7)),但这是不可能的,因为 "LocalDate.now().minusDays(7) "是LocalDate类型,而不是Instant类型,而且当使用Date时,我没有".minusDays(7) "的能力了。

  • 注2在现实中,我的字符串有时以 "add-vvd-sfsf-...... "或更多开头,这就是为什么我从结尾处开始修剪的原因

非常感谢。

java string date formatting epoch
1个回答
5
投票

2020-02-19t10:23:31.180z 是在一个标准的 ISO 8601 日期格式,Java 8+时间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)调整输入中的UTC时区偏移量到本地时区,然后比较纯日期(如果时区偏移跨越午夜),你可以这样做。

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.