java - 如何在 Java 的 Calendar 类中获取用户输入的日期而不是当前日期?

标签 java date calendar dayofweek java.util.calendar

我正在做一项作业,我的目标是创建一个类,在给定日期的情况下打印星期几。当提示输入时,如果用户什么都不输入,程序就会停止。否则,如果用户输入日期,程序会提供星期几,然后继续重新提示用户。用户输入的日期格式为 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 DateSimpleDateFormat。后者可能是其中最麻烦的,当然也是要避免的。

    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/

相关文章:

java - Struts普通JSP多种形式

javascript - 如何使用 JavaScript 或 jQuery 解析 "dd/mm/yyyy"或 "dd-mm-yyyy"或 "dd-mmm-yyyy"格式的日期字符串

c# - 如何在 C#/SQL Server 中跟踪重复的日历事件?

java - kotlin 中的 supportFragmentManager.commit 不起作用

java - Eclipse 说堆已损坏

javascript - 为什么我可以解析无效的日期字符串?

android - 如何在Android中设置提醒?

database - 表示数据库中复杂的计划重复

java - mediaplayer.isPlaying 始终为 false

mysql - 条件查询获取两个日期之间有间隔的数据