如何解决如何用 31 天解析二月和月份的日期?
感谢您提供可能的答案。问题是,我使用带有 Java 1.4 的遗留系统。在注册表中,您有以下字段: mm / yyyy 格式的“Period” 'Expiration Day' 将日期与句点连接起来并解析为日期。
我需要处理 2 月的 29 个月和 31 天的月份。将“到期日”设置为 31,当是 2 月时,解析将在 03/01/2021 播放,在不是 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.
解决方法
我将介绍不同 Java 版本的解决方案。
Java 8 及更高版本:java.time
我建议您使用 java.time,现代 Java 日期和时间 API,用于您的日期工作。
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:java.time 到 ThreeTen Backport
代码同上。 java.time 已在 ThreeTen Backport 项目中向后移植到 Java 6 和 7。链接在底部。
Java 1.5:Joda 时间
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
链接
- Oracle tutorial: Date Time 解释如何使用 java.time。
-
Java Specification Request (JSR) 310,其中首次描述了
java.time
。 -
ThreeTen Backport project,将
java.time
向后移植到 Java 6 和 7(JSR-310 的 ThreeTen)。 - Joda-Time
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。