-1

我感谢您提供可能的答案。问题是,我使用 Java 1.4 的遗留系统。在注册表单中,您有以下字段: mm / yyyy 格式的 'Period' 'Expiration Day' 将日期与期间连接并解析为 Date。

我需要处理 29 月份和 31 天月份。设置“到期日”= 31,当它是 2 月时,解析将在 2021 年 3 月 1 日播放,而在不是 31 的月份,解析将在下个月的第一天播放。对于这些情况,我需要解析需要当月的最后一天而不是下个月。我已经研究过,但没有看到如何通过解析自己来做到这一点。

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date dataDebito = df.parse(31 + "/" + 02 + "/" + 2021); //February is not 31 and I need you to parse it for 2/28/2021 or 2/29/2021 if it was a leap year.
4

1 回答 1

0

我将介绍不同 Java 版本的解决方案。

Java 8 及更高版本:java.time

我建议您使用现代 Java 日期和时间 API java.time 进行日期工作。

    DateTimeFormatter expirationParser = DateTimeFormatter.ofPattern("MM/uuuu");
     
    String expirationString = "02/2021";
    
    LocalDate expirationDay = YearMonth.parse(expirationString, expirationParser)
            .atEndOfMonth();

    System.out.println(expirationDay);

输出:

2021-02-28

Java 6 和 7:通过 ThreeTen Backport 的 java.time

代码与上面相同。java.time 已在 ThreeTen Backport 项目中向后移植到 Java 6 和 7。链接在底部。

Java 1.5:Joda-Time

    DateTimeFormatter expirationParser = DateTimeFormat.forPattern("MM/yyyy");
    
    String expirationString = "02/2021";

    LocalDate expirationDay = YearMonth.parse(expirationString, expirationParser)
            .plusMonths(1) // following month
            .toLocalDate(1) // day 1 of month
            .minusDays(1); // last day of expiration month
    
    System.out.println(expirationDay);

2021-02-28

Java 1.1 到 1.4:日历

    DateFormat expirationFormat = new SimpleDateFormat("MM/yyyy");
    
    String expirationString = "02/2021";

    Date expirationMonth = expirationFormat.parse(expirationString);
    Calendar expirationCalendar = Calendar.getInstance();
    expirationCalendar.setTime(expirationMonth);
    expirationCalendar.add(Calendar.MONTH, 1); // 1st of following month
    expirationCalendar.add(Calendar.DATE, -1); // Last day of expiration month

    System.out.println(expirationCalendar.getTime());

2021 年 2 月 28 日星期日 00:00:00 CET

链接

于 2021-04-12T19:25:28.510 回答