如何解析“中的日期(以字符串形式提供);ddMM“;格式化并将其转换为Java中的日期对象?
我正在使用如何解析“中的日期(以字符串形式提供);ddMM“;格式化并将其转换为Java中的日期对象?,java,date,parsing,Java,Date,Parsing,我正在使用simpleDataFormatter类将字符串转换为日期。我有以下代码,适用于2020年2月27日: SimpleDateFormat FORMATTER = new SimpleDateFormat("ddMM"); //always current year Date TODAY = FORMATTER.parse("2702"); System.out.println(TODAY); 此决议的生效日期如下: Fri Feb 27 00:00:00 UTC 1970 然而,当
simpleDataFormatter
类将字符串转换为日期。我有以下代码,适用于2020年2月27日:
SimpleDateFormat FORMATTER = new SimpleDateFormat("ddMM"); //always current year
Date TODAY = FORMATTER.parse("2702");
System.out.println(TODAY);
此决议的生效日期如下:
Fri Feb 27 00:00:00 UTC 1970
然而,当我在2020年2月29日(闰年)尝试同样的方法时,我得到了一个错误:
代码:
输出:
Sun Mar 01 00:00:00 UTC 1970
有人能建议一种方法,让我也能考虑闰年,使用这个日期格式吗
谢谢。您应该使用Java 8时间API,因为它支持指定默认年份
public static Date dayMonthToDate(String dayMonth) {
DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("ddMM")
.parseDefaulting(ChronoField.YEAR, Year.now().getValue())
.toFormatter();
LocalDate localDate = LocalDate.parse(dayMonth, FORMATTER);
Instant instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();
return Date.from(instant);
}
试验
输出
2020年2月27日星期四00:00:00 UTC
星期六2020年2月29日00:00:00 UTC
如果你运行程序时不是闰年,并且你在2月29日通过了它,那么你希望结果日期是哪一年?1970
不是闰年:/edge的情况很好,我认为在这种情况下,结果应该是个例外。作为首选,我建议使用更新的java.time.*
API。在这种情况下,您应该指定锚定年份,我建议您不要使用SimpleDateFormat
和Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。而是使用LocalDate
和DateTimeFormatter
,两者都来自。您也可以从JavaTimes中考虑<代码> DateTimeFormatterBuilder < /COD>或<代码> Nothay。
public static Date dayMonthToDate(String dayMonth) {
DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("ddMM")
.parseDefaulting(ChronoField.YEAR, Year.now().getValue())
.toFormatter();
LocalDate localDate = LocalDate.parse(dayMonth, FORMATTER);
Instant instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();
return Date.from(instant);
}
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
System.out.println(dayMonthToDate("2702"));
System.out.println(dayMonthToDate("2902"));
}