calendar.getDisplayName返回错误的日期

时间:2018-09-24 05:33:37

标签: java calendar

下面是我的程序,当我输入相关的月份,日期和年份时,它返回了错误的日期名称。

我在这里想念什么?

我的程序

import java.util.Calendar;
import java.util.Locale;
import java.util.Scanner;

public class TimeTest {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String month = in.next();
        String day = in.next();
        String year = in.next();

        System.out.println(getDay(day, month, year));
    }

    private static String getDay(String day, String month, String year) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));
        return calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());

    }
}      


输出:

09
24
2018
Wednesday       

应该返回“ Monday”,因为那是当前日期。

3 个答案:

答案 0 :(得分:4)

您假设 9月,因此实际上是 09 ,但实际上,在日历类中,它是 8月月份从00(Jan), 01(Feb)...开始,依此类推。

因此,为了获得正确的输出,您需要通过

08 // September Month not August
24
2018

这是您的running code

答案 1 :(得分:1)

Neeraj Jain已经在another answer中解释了为什么得到意外输出的原因。我想贡献一种现代的方式来获得您的结果。

首先,您的用户可能希望以自己的语言环境格式在一行中输入日期,例如美国的9/24/18或法语的24/09/2018。并不复杂(只要您知道如何操作):

    DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
                    .withLocale(Locale.getDefault(Locale.Category.FORMAT));
    String dateString = in.next();
    LocalDate date = LocalDate.parse(dateString, dateFormatter);
    DayOfWeek dow = date.getDayOfWeek();
    String dowString = dow.getDisplayName(
                           TextStyle.FULL_STANDALONE,
                           Locale.getDefault(Locale.Category.FORMAT)
                       );
    System.out.println(dowString);

以下是该程序在美国语言环境中的运行示例:

9/25/18
Tuesday

如果您或您的用户确实喜欢在问题中的程序中输入三个单独的数字:

    Scanner in = new Scanner(System.in);
    int month = in.nextInt();
    int day = in.nextInt();
    int year = in.nextInt();
    LocalDate date = LocalDate.of(year, month, day);

现在我们有了LocalDate,其余部分与以前相同。运行示例:

9
27
2018
Thursday

请注意,在任何地方都不会加减1,因为LocalDate的数字与人类的月份相同。我让扫描仪转换为整数,我发现它比调用Integer.parseInt更为简单。

您使用的Calendar类早已过时且设计不良。我建议您不要担心它的麻烦,而应使用Java.time(现代的Java日期和时间API)中的LocalDate

链接: Oracle tutorial: Date Time解释了如何使用java.time

答案 2 :(得分:1)

通过使用java.time.LocalDate,您可以传递3个参数(年,月,日)并获得dayOfWeek:

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String month = in.next();
    String day = in.next();
    String year = in.next();

    System.out.println(getDay(day, month, year));
}

private static String getDay(String day, String month, String year) {
    return LocalDate.of(Integer.valueOf(year), Integer.valueOf(month), Integer.valueOf(day)).getDayOfWeek()
            .toString();
}