类型 Calendar 中的方法 set(int, int) 不适用于参数 (int, String)

Posted

技术标签:

【中文标题】类型 Calendar 中的方法 set(int, int) 不适用于参数 (int, String)【英文标题】:The method set(int, int) in the type Calendar is not applicable for the arguments (int, String) 【发布时间】:2018-12-20 14:40:17 【问题描述】:

Java 代码从给定的星期几、月份的星期、月份和年份创建日期作为输入。示例 - 如果输入如下:

天-周一、月-7 月、第 1 周、2018 年、

那么输出应该是-02/07/2018。

下面是使用的代码:

        System.out.println("Enter a year,month,week,day:");
        int year = Integer.parseInt(obj.nextLine());
        int month = Integer.parseInt(obj.nextLine());
        int week = Integer.parseInt(obj.nextLine());
        String day = obj.nextLine();

        String date;

        SimpleDateFormat dateFormat = new SimpleDateFormat ("yyyy/MM/dd");

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year); // set the year
        cal.set(Calendar.MONTH, month-1); // set the month
        cal.set(Calendar.WEEK_OF_MONTH, week);

        //***error in the below line********
        cal.set(Calendar.DAY_OF_WEEK,day);

        date=dateFormat.format(cal.getTime());
        System.out.println("Result:" +date);

标记的行不会编译。为什么不?我该如何解决?

【问题讨论】:

欢迎。到目前为止,您尝试了什么,您在哪里卡住了?如果您不付出任何努力,我们可能无法为您提供帮助。 不幸的是,您的问题归结为“请有人帮我解决这个问题”。但我们不将此类请求视为本网站范围内的问题。请仔细阅读this 以了解原因。然后考虑删除这个问题并在这个社区的范围内提出一个新的、更精确的问题。或者,您可以edit,返工和改进这个问题。谢谢! 添加了代码,如果我指定星期几,则无法获取日期。谢谢 感谢您的代码,它有帮助。您使用的日期和时间类SimpleDateFormatCalendar 早已过时且设计不佳。我建议你把它们扔在肩膀上,而不是使用java.time, the modern Java date and time API。 【参考方案1】:

您似乎缺少的一点是,当用户输入例如“星期一”时,您需要将此字符串转换为 Java 可以理解为星期几的内容。这是通过解析完成的。幸运的是,使用现代 Java 日期和时间 API java.time 并不难(当您知道如何操作时)。这就是我们在以下代码中使用dowFormatter 的原因(dow 表示星期几):

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");

    DateTimeFormatter dowFormatter 
            = DateTimeFormatter.ofPattern("EEEE", Locale.getDefault(Locale.Category.FORMAT));
    DayOfWeek dow = DayOfWeek.from(dowFormatter.parse(day));

    WeekFields wf = WeekFields.of(Locale.getDefault(Locale.Category.DISPLAY));

    LocalDate date = LocalDate.of(year, month, 15)
            .with(dow)
            .with(wf.weekOfMonth(), week);
    System.out.println("Result: " + date.format(dateFormatter));

现在当我输入 2018 年 7 月 1 日和星期一时,我得到:

结果:2018/07/02

如果您想控制用户输入星期几的语言,请将适当的区域设置传递给格式化程序(而不是 Locale.getDefault(Locale.Category.FORMAT))。如果你希望它只支持英文,你可以使用更短的DayOfWeek dow = DayOfWeek.valueOf(day.toUpperCase(Locale.ROOT));,但这有点小技巧。

如果您想控制使用的星期方案,请将适当的语言环境传递给 WeekFields.of() 或仅指定 WeekFields.ISOWeekFields.SUNDAY_START

我建议您不要使用SimpleDateFormatCalendar。这些课程早已过时。 java.time 更好用。

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

【讨论】:

以上是关于类型 Calendar 中的方法 set(int, int) 不适用于参数 (int, String)的主要内容,如果未能解决你的问题,请参考以下文章

Android Calendar.set方法,设置星期几

Java 之 JDK 1.8 新增日期时间类型

java 14 -10 Calendar类以及练习

Calendar类经常用法 日期间的转换 set方法有巨坑

java中,我已经知道了一个时间,如何实现在这个时间的基础上一年后 的前一天时间。

Java中Date各种相关用法