我需要代码以 mm dd yyyy 格式(通过标准输入)获取日期,并以简单的英语输出工作日。
样本输入(mm dd yyyy): 09 23 2016
预期输出:星期五
输出错误: SUNDAY
任何人都可以解释一下这里出了什么问题吗?谢谢。
import java.io.*;
import java.util.*;
import java.time.*;
public class DateToDay {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int month = Integer.parseInt(in.next());
int day = Integer.parseInt(in.next());
int year = Integer.parseInt(in.next());
if ((year > 2000) && (year < 3000)) {
Calendar cal = Calendar.getInstance();
Locale locale = Locale.getDefault();
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DAY_OF_MONTH, day);
cal.set(Calendar.YEAR, year);
System.out.println(cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, locale).toUpperCase());
}
else {
System.out.println("Invalid date entered.");
}
}
}
答案 0 :(得分:3)
Calendar.Month基于零:
MONTH public static final int MONTH
get和set的字段编号,表示月份。这是一个 特定于日历的值。格里高利一年中的第一个月 朱利安的日历是1月1日,是0;最后取决于 一年中的月数。另见:
所以9月10日,2016年10月23日是星期日。所以你必须使用cal.set(Calendar.MONTH, month-1);
如果您使用的是java8,则只需使用新的DateTime API:
LocalDate date = LocalDate.of(year, month, day);
System.out.println(date.getDayOfWeek());
答案 1 :(得分:1)
Scanner in = new Scanner(System.in);
int month = Integer.parseInt(in.next());
int day = Integer.parseInt(in.next());
int year = Integer.parseInt(in.next());
if ((year > 2000) && (year < 3000)) {
Calendar cal = Calendar.getInstance();
Locale locale = Locale.getDefault();
cal.set(Calendar.MONTH, month-1);
cal.set(Calendar.DAY_OF_MONTH, day);
cal.set(Calendar.YEAR, year);
System.out.println(cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, locale).toUpperCase());
}
else {
System.out.println("Invalid date entered.");
}
答案 2 :(得分:1)
问题出在这里。
cal.set(Calendar.MONTH, month);
如果Calendar.MONTH
为0,则月份为1月。
如果Calendar.MONTH
为1,则月份为2月。
如果Calendar.MONTH
为2,则月份为3月,依此类推。
因此,当您输入09作为输入时,Calendar.MONTH
将变为10月,而不是9月。这是因为,如上所述,Calendar.MONTH
从0开始。
请改为尝试:
cal.set(Calendar.MONTH, month-1);