Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解析“中的日期(以字符串形式提供);ddMM“;格式化并将其转换为Java中的日期对象?_Java_Date_Parsing - Fatal编程技术网

如何解析“中的日期(以字符串形式提供);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"));
}