将日期与月份作为字符串进行比较

Comparing dates with months as strings

我正在尝试比较这两个日期:

17 Oct. 2019 (08:23)
19 déc. 2019 (21:15)

月份是法语,主要问题是月份。我是否需要为每种类型的月份添加一个 if 语句,以便我可以将其切换为适当的月份?例如:

if (MonthValue.equals("oct."){
    DateValue.replace("oct.","10");
}

或者是否有更简单的解决方案,因为如果第一个值大于第二个值,我需要检查 table。

编辑: 我的新密码:

String target1 = "17 oct. 2019 (08:23)";
        String target2 = "19 déc. 2019 (21:15)";
        DateFormat df = new SimpleDateFormat("dd MMM. YYYY (kk:mm)", Locale.FRENCH);
        Date result =  df.parse(target1);  
        Date result2 =  df.parse(target2); 
        System.out.println(result);
        System.out.println(result2);
        if(result.compareTo(result2) < 0) {
            System.out.println("true");
        }
        else {
            System.out.println("false");
        }

不工作给出这个错误:

java.text.ParseException: Unparseable date: "17 oct. 2019 (08:23)"

我的推荐:

我从你的问题中得到的是,你想将月份的名称转换为它们各自的数字。如果是这种情况,那么您应该尝试 switch
示例:

switch (MonthValue){
    case jan:
      MonthValue = 1; // Set Month variable to it Numbered Position (type casting might be required)
      break;
    case feb:
      MonthValue = 2;
      break;
    default:
      System.out.println("Somthing...");
}

使用带有模式 dd MMM yyyy (HH:mm) 的 DateTimeFormatter 来像这样解析日期字符串

String target1 = "17 oct. 2019 (08:23)";
String target2 = "19 déc. 2019 (21:15)";

Locale locale = Locale.FRANCE;
DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder().appendPattern("dd MMM yyyy (HH:mm)")
        .toFormatter(locale);
LocalDateTime dateTime1 = LocalDateTime.parse(target1, dateTimeFormatter);
LocalDateTime dateTime2 = LocalDateTime.parse(target2, dateTimeFormatter);

System.out.println(dateTime1);
System.out.println(dateTime2);
if (dateTime1.compareTo(dateTime2) < 0) {
    System.out.println("true");
} else {
    System.out.println("false");
}

尝试编码为 UTF8,这将避免 DateTimeParseException Exception in thread "main" java.time.format.DateTimeParseException: Text '19 d??c. 2019 (21:15)' could not be parsed at index 3

    public static void main(String args[]) throws Exception {
        String date1 = "17 oct. 2019 (08:23)";
        String date2 = "19 déc. 2019 (21:15)";
        
        DateTimeFormatter longDateTimeFormatter = DateTimeFormatter.ofPattern("dd MMM yyyy (HH:mm)").withLocale(Locale.FRENCH);
        LocalDateTime lclDate1 = LocalDateTime.parse(encodeUTF8(date1), longDateTimeFormatter);
        LocalDateTime lclDate2 = LocalDateTime.parse(encodeUTF8(date2), longDateTimeFormatter);
        if (lclDate1.compareTo(lclDate2) < 0) {
            System.out.println("true");
        }
        else {
            System.out.println("false");
        }
    }
    
    public static String encodeUTF8(String dateStr) {
        byte[] bytes = dateStr.getBytes();
        String utf8EncodStr = new String(bytes, StandardCharsets.UTF_8);
        return utf8EncodStr;
    }

java.time 和格式模式字符串中的可选部分

与其他人一样,我建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。据我了解,如果您的月份名称不超过五个字母(例如 avril),它们将完整写出,而如果它们不超过七个字母(例如 juillet),它们是缩写形式。以下格式化程序可以在两种情况下解析:

private static final DateTimeFormatter DATE_FORMATTER
        = new DateTimeFormatterBuilder()
                .parseCaseInsensitive()
                .appendPattern("dd [MMMM][MMM] uuuu (HH:mm)")
                .toFormatter(Locale.FRENCH);    

格式模式字符串中的方括号[]包围可选部分。 MMMM 是完整的月份名称。 MMM 为缩写。所以 [MMMM][MMM] 中的要点是它将成功解析完整的月份名称或缩写,并跳过不起作用的那个。由于您举了一个 Oct. 是用大写字母 O 编写的示例,因此我还指定了解析不应区分大小写。如果这不是必需的,您可以使用这个更简单的格式化程序:

private static final DateTimeFormatter DATE_FORMATTER
        = DateTimeFormatter.ofPattern("dd [MMMM][MMM] uuuu (HH:mm)", Locale.FRENCH);

为了检查所有月份是否工作,我设置了这些测试数据:

    String[] dateStrings = {
            "17 Oct. 2019 (08:23)",
            "19 déc. 2019 (21:15)",
            "01 avril 2021 (09:40)",
            "08 janv. 2020 (01:18)",
            "28 févr. 2021 (21:41)",
            "03 mars 2020 (22:54)",
            "06 mai 2020 (03:14)",
            "21 juin 2020 (07:15)",
            "18 juil. 2020 (23:06)",
            "06 août 2020 (22:28)",
            "29 sept. 2020 (06:04)",
            "18 nov. 2019 (01:35)"
    };

要解析和比较其中两个,请使用 LocalDateTime.parse().isBefore():

    LocalDateTime dateTime1 = LocalDateTime.parse(dateStrings[1], DATE_FORMATTER);
    LocalDateTime dateTime2 = LocalDateTime.parse(dateStrings[2], DATE_FORMATTER);
    if (dateTime1.isBefore(dateTime2)) {
        System.out.format(Locale.FRENCH, "%s is before %s%n", dateTime1, dateTime2);
    }

输出:

2019-12-19T21:15 is before 2021-04-01T09:40

为了比较,您还可以利用 LocalDateTime 实现 Comparable 这一事实。例如,这在对日期和时间进行排序时很实用。作为一个简短的例子,让我们对解析上述字符串后得到的所有 LocalDateTime 个对象进行排序:

    Arrays.stream(dateStrings)
            .map(ds -> LocalDateTime.parse(ds, DATE_FORMATTER))
            .sorted()
            .forEach(System.out::println);
2019-10-17T08:23
2019-11-18T01:35
2019-12-19T21:15
2020-01-08T01:18
2020-03-03T22:54
2020-05-06T03:14
2020-06-21T07:15
2020-07-18T23:06
2020-08-06T22:28
2020-09-29T06:04
2021-02-28T21:41
2021-04-01T09:40

Link: Trail: Date Time (The Java™ Tutorials) 解释如何使用 java.time.