我正在做一项作业,我的目标是创建一个类,在给定日期的情况下打印星期几。当提示输入时,如果用户什么都不输入,程序就会停止。否则,如果用户输入日期,程序会提供星期几,然后继续重新提示用户。用户输入的日期格式为 m dy,例如 1 10 2017 表示 2017 年 1 月 10 日。
到目前为止,我所拥有的已经满足了我需要的一切,除了它使用当前的日、月和年,而不是用户输入的日、月和年。
import java.util.Calendar;
import java.util.Scanner;
public class FindDayOfWeek {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Repeatedly enter a date (m d y) to get the day of week. Terminate input with a blank line.");
String date = s.nextLine();
while (true) {
if (date.isEmpty()) {
System.exit(0);
}
else {
Calendar c = Calendar.getInstance();
String[] days = new String[] {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
System.out.println("Day of week is " + days[c.get(Calendar.DAY_OF_WEEK) - 1]);
System.out.println("Repeatedly enter a date (m d y) to get the day of week. Terminate input with a blank line.");
date = s.nextLine();
}
}
}
}
我知道需要替换的是 c.get(Calendar.DAY_OF_WEEK) 的倒数第二段代码,但是我不知道可以用什么来替换它以获得用户输入的日期。
我知道还有其他包可以解决同样的问题,但是,无论我喜欢与否,我都需要使用 Calendar 类。
最佳答案
尽量减少使用过时的 API
shash678’s answer是正确的,也推荐使用 java.time
而不是您需要使用的早已过时的 Calendar
类。我只是想在这里补充一点:即使您需要使用 Calendar
类,但这并不一定意味着您还需要使用它过时的 friend Date
和SimpleDateFormat
。后者可能是其中最麻烦的,当然也是要避免的。
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("M d u");
Scanner s = new Scanner(System.in);
System.out.println("Repeatedly enter a date (m d y) to get the day of week."
+ " Terminate input with a blank line.");
String date = s.nextLine();
LocalDate ld = LocalDate.parse(date, inputFormatter);
// the easy way to get day-of-week would be ld.getDayOfWeek(),
// but we are required to use Calendar
// (any ZoneId will do for atStartOfDay(), I just prefer to provide one)
Calendar c = GregorianCalendar.from(ld.atStartOfDay(ZoneOffset.UTC));
int numberOfDayOfWeek = c.get(Calendar.DAY_OF_WEEK);
// display
DayOfWeek dayOfWeek;
// Calendar’s dayOfWeek starts from 1 = Sunday;
// for DayOfWeek.of() we need to start from 1 = Monday
if (numberOfDayOfWeek == Calendar.SUNDAY) {
dayOfWeek = DayOfWeek.SUNDAY;
} else {
dayOfWeek = DayOfWeek.of(numberOfDayOfWeek - 1);
}
System.out.println("Day of week is "
+ dayOfWeek.getDisplayName(TextStyle.FULL_STANDALONE, Locale.US));
示例 session :
Repeatedly enter a date (m d y) to get the day of week. Terminate input with a blank line.
10 5 2017
Day of week is Thursday
我省略了重复,直到输入空行,因为您似乎已经处理了这个问题。
虽然上述内容肯定不是您的讲师所追求的,但在现实生活中,使用特定过时类的要求通常来自于使用需要和/或为您提供该旧类的实例的遗留 API。在这种情况下,我建议您尽量减少旧 API 的使用,并尽可能地使用现代 API。因此,在代码中,我仅在查找星期几之前的最后一刻才转换为日历。无论是从 Date
转换为 Calendar
还是从 LocalDate
转换为 Calendar
都不会对复杂性产生太大影响代码,因此您不妨使用现代的 LocalDate
。
通过将 Calendar
中的 int
转换回现代 DayOfWeek
枚举,我确实增加了一点额外的复杂性,我将其用于显示日期名称。如果您愿意,可以省略这部分。我添加它只是为了证明在从 int
转换为日期名称时,有一种方法可以避免重新发明轮子。
关于java - 如何在 Java 的 Calendar 类中获取用户输入的日期而不是当前日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46554701/