Java Calendar.DAY_OF_WEEK 给错了日期
Java Calendar.DAY_OF_WEEK gives wrong day
下面的代码有什么问题?它给出了一年中任何日期的错误日期。
import java.util.Scanner;
import java.util.Calendar;
public class Solution {
public static String getDay(String d, String m, String y) {
String[] days = {"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"};
Calendar c = Calendar.getInstance();
c.set(Integer.parseInt(y), Integer.parseInt(m), Integer.parseInt(d));
return days[c.get(Calendar.DAY_OF_WEEK) - 1];
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String m = in.next();
String d = in.next();
String y = in.next();
System.out.println(getDay(d, m, y));
}
}
请参阅 Calendar
class 的文档:https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#set-int-int-int-
月份的值是从 0 开始索引的,因此如果您提供 3
作为月份值,它将被解释为 "April"。
让 Scanner
读取 int
值比字符串更容易:
int m = in.nextInt();
int d = in.nextInt();
int y = in.nextInt();
System.out.println(LocalDate.of(y, m, d).getDayOfWeek());
当我输入 5 4 2018
(今天的日期)时,我得到 FRIDAY
,这是正确的。
如果必须使用字符串:
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("M/d/u");
String m = in.next();
String d = in.next();
String y = in.next();
System.out.println(LocalDate.parse(m + '/' + d + '/' + y, dateFormatter).getDayOfWeek());
您使用的 Calendar
class 早已过时,设计不佳,有时使用起来很麻烦。相反,我推荐 java.time
,现代 Java 日期和时间 API。它好多了。对于一件小事,它以与人类相同的方式计算一年中的月份。
星期几的名称也是内置的,所以不要重新发明轮子。您的字符串与 java.time
中 DayOfWeek
枚举值的名称一致,因此只需打印这些即可获得所需的字符串。如果您不想全部大写或希望使用其他语言的日期名称,请使用 DayOfWeek.getDisplayName
或 DateTimeFormatter
.
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.
下面的代码有什么问题?它给出了一年中任何日期的错误日期。
import java.util.Scanner;
import java.util.Calendar;
public class Solution {
public static String getDay(String d, String m, String y) {
String[] days = {"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"};
Calendar c = Calendar.getInstance();
c.set(Integer.parseInt(y), Integer.parseInt(m), Integer.parseInt(d));
return days[c.get(Calendar.DAY_OF_WEEK) - 1];
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String m = in.next();
String d = in.next();
String y = in.next();
System.out.println(getDay(d, m, y));
}
}
请参阅 Calendar
class 的文档:https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#set-int-int-int-
月份的值是从 0 开始索引的,因此如果您提供 3
作为月份值,它将被解释为 "April"。
让 Scanner
读取 int
值比字符串更容易:
int m = in.nextInt();
int d = in.nextInt();
int y = in.nextInt();
System.out.println(LocalDate.of(y, m, d).getDayOfWeek());
当我输入 5 4 2018
(今天的日期)时,我得到 FRIDAY
,这是正确的。
如果必须使用字符串:
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("M/d/u");
String m = in.next();
String d = in.next();
String y = in.next();
System.out.println(LocalDate.parse(m + '/' + d + '/' + y, dateFormatter).getDayOfWeek());
您使用的 Calendar
class 早已过时,设计不佳,有时使用起来很麻烦。相反,我推荐 java.time
,现代 Java 日期和时间 API。它好多了。对于一件小事,它以与人类相同的方式计算一年中的月份。
星期几的名称也是内置的,所以不要重新发明轮子。您的字符串与 java.time
中 DayOfWeek
枚举值的名称一致,因此只需打印这些即可获得所需的字符串。如果您不想全部大写或希望使用其他语言的日期名称,请使用 DayOfWeek.getDisplayName
或 DateTimeFormatter
.
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.