SimpleDateFormat 在给定日期返回不正确的日期

SimpleDateFormat returning incorrect day on given date

我最近在 HackerRank 上做一道题,要求我找出给定日期的日期。我用 SimpleDateFormat 找到了这一天。

下面是我的代码:

String sd = Integer.toString(day) + "-" + Integer.toString(month) + "-" + Integer.toString(year);
try {
    Date d = new SimpleDateFormat("DD-MM-yyyy").parse(sd);
    SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
    return sdf.format(d).toUpperCase();
} catch (Exception e) {
    return "";
}

这里有趣的是,上面的代码打印了今天日期的正确结果,即 03/04/2020(Friday) 但它是 return 在 05/08/ 上的错误日期2015 年(应该是 return Wednesday 而是 returns Monday)。

请帮我找出问题。

谢谢。

编辑 我犯了一个小错误,我想使用一个月中的某一天,为此必须使用 ddDD 表示一年中的第几天。这解决了我的问题!

您应该使用 SimpleDateFormat("dd-MM-yyyy")

DD代表一年中的某一天,就像一年有365天一样。

问题的原因是使用 DD 而不是 dd

我也建议你不要使用过时的 date/time API 例如java.util.Date and SimpleDateFormat. Instead, you should use the modern date/time API e.g. types from the packages, java.time and java.time.format如下图:

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.TextStyle;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        int day = 5;
        int month = 8;
        int year = 2010;
        LocalDate date = LocalDate.of(year, month, day);
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        System.out.println(dayOfWeek);
        System.out.println(dayOfWeek.getDisplayName(TextStyle.FULL, Locale.US));
        System.out.println(dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.US));
    }
}

输出:

THURSDAY
Thursday
Thu

使用DateTimeFormatter:

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        int day = 5;
        int month = 8;
        int year = 2010;
        String sd = String.format("%02d", day) + "-" + String.format("%02d", month) + "-" + String.format("%04d", year);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
        LocalDate date = LocalDate.parse(sd, formatter);
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        System.out.println(dayOfWeek);
        System.out.println(dayOfWeek.getDisplayName(TextStyle.FULL, Locale.US));
        System.out.println(dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.US));
    }
}

输出:

THURSDAY
Thursday
Thu