类型 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,返工和改进这个问题。谢谢! 添加了代码,如果我指定星期几,则无法获取日期。谢谢 感谢您的代码,它有帮助。您使用的日期和时间类SimpleDateFormat
和Calendar
早已过时且设计不佳。我建议你把它们扔在肩膀上,而不是使用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.ISO
或 WeekFields.SUNDAY_START
。
我建议您不要使用SimpleDateFormat
和Calendar
。这些课程早已过时。 java.time
更好用。
链接:Oracle tutorial: Date Time解释如何使用java.time
。
【讨论】:
以上是关于类型 Calendar 中的方法 set(int, int) 不适用于参数 (int, String)的主要内容,如果未能解决你的问题,请参考以下文章