下面是我的程序,当我输入相关的月份,日期和年份时,它返回了错误的日期名称。
我在这里想念什么?
我的程序
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”,因为那是当前日期。
答案 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();
}