Calendar 类型中的方法 set(int, int) 不适用于参数 (int, String)
The method set(int, int) in the type Calendar is not applicable for the arguments (int, String)
Java 代码,用于根据给定的星期几、月中的星期、月份和年份创建日期作为输入。示例-如果输入如下:
day-Monday, month-july, week-1, year-2018,
那么输出应该be-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);
标记的行不会编译。为什么不?我该如何解决?
您似乎缺少的一点是,当用户输入例如“星期一”时,您需要将此字符串转换为 Java 可以理解为星期几的内容。这是通过 解析 完成的。幸运的是,使用 java.time
、现代 Java 日期和时间 API,这并不难(如果您知道怎么做)。这就是我们在以下代码中使用 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 和星期一时,我得到:
Result: 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
更好用。
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.
Java 代码,用于根据给定的星期几、月中的星期、月份和年份创建日期作为输入。示例-如果输入如下:
day-Monday, month-july, week-1, year-2018,
那么输出应该be-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);
标记的行不会编译。为什么不?我该如何解决?
您似乎缺少的一点是,当用户输入例如“星期一”时,您需要将此字符串转换为 Java 可以理解为星期几的内容。这是通过 解析 完成的。幸运的是,使用 java.time
、现代 Java 日期和时间 API,这并不难(如果您知道怎么做)。这就是我们在以下代码中使用 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 和星期一时,我得到:
Result: 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
更好用。
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.