SimpleDateFormat 在给定日期返回不正确的日期
SimpleDateFormat returning incorrect day on given date
我最近在 HackerRank 上做一道题,要求我找出给定日期的日期。我用 SimpleDateFormat
找到了这一天。
下面是我的代码:
String sd = Integer.toString(day) + "-" + Integer.toString(month) + "-" + Integer.toString(year);
try {
Date d = new SimpleDateFormat("DD-MM-yyyy").parse(sd);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
return sdf.format(d).toUpperCase();
} catch (Exception e) {
return "";
}
这里有趣的是,上面的代码打印了今天日期的正确结果,即 03/04/2020(Friday
) 但它是 return 在 05/08/ 上的错误日期2015 年(应该是 return Wednesday
而是 returns Monday
)。
请帮我找出问题。
谢谢。
编辑
我犯了一个小错误,我想使用一个月中的某一天,为此必须使用 dd
。 DD
表示一年中的第几天。这解决了我的问题!
您应该使用 SimpleDateFormat("dd-MM-yyyy")
。
DD代表一年中的某一天,就像一年有365天一样。
问题的原因是使用 DD
而不是 dd
。
我也建议你不要使用过时的 date/time API 例如java.util.Date and SimpleDateFormat. Instead, you should use the modern date/time API e.g. types from the packages, java.time and java.time.format如下图:
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.TextStyle;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
int day = 5;
int month = 8;
int year = 2010;
LocalDate date = LocalDate.of(year, month, day);
DayOfWeek dayOfWeek = date.getDayOfWeek();
System.out.println(dayOfWeek);
System.out.println(dayOfWeek.getDisplayName(TextStyle.FULL, Locale.US));
System.out.println(dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.US));
}
}
输出:
THURSDAY
Thursday
Thu
使用DateTimeFormatter
:
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
int day = 5;
int month = 8;
int year = 2010;
String sd = String.format("%02d", day) + "-" + String.format("%02d", month) + "-" + String.format("%04d", year);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate date = LocalDate.parse(sd, formatter);
DayOfWeek dayOfWeek = date.getDayOfWeek();
System.out.println(dayOfWeek);
System.out.println(dayOfWeek.getDisplayName(TextStyle.FULL, Locale.US));
System.out.println(dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.US));
}
}
输出:
THURSDAY
Thursday
Thu
我最近在 HackerRank 上做一道题,要求我找出给定日期的日期。我用 SimpleDateFormat
找到了这一天。
下面是我的代码:
String sd = Integer.toString(day) + "-" + Integer.toString(month) + "-" + Integer.toString(year);
try {
Date d = new SimpleDateFormat("DD-MM-yyyy").parse(sd);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
return sdf.format(d).toUpperCase();
} catch (Exception e) {
return "";
}
这里有趣的是,上面的代码打印了今天日期的正确结果,即 03/04/2020(Friday
) 但它是 return 在 05/08/ 上的错误日期2015 年(应该是 return Wednesday
而是 returns Monday
)。
请帮我找出问题。
谢谢。
编辑
我犯了一个小错误,我想使用一个月中的某一天,为此必须使用 dd
。 DD
表示一年中的第几天。这解决了我的问题!
您应该使用 SimpleDateFormat("dd-MM-yyyy")
。
DD代表一年中的某一天,就像一年有365天一样。
问题的原因是使用 DD
而不是 dd
。
我也建议你不要使用过时的 date/time API 例如java.util.Date and SimpleDateFormat. Instead, you should use the modern date/time API e.g. types from the packages, java.time and java.time.format如下图:
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.TextStyle;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
int day = 5;
int month = 8;
int year = 2010;
LocalDate date = LocalDate.of(year, month, day);
DayOfWeek dayOfWeek = date.getDayOfWeek();
System.out.println(dayOfWeek);
System.out.println(dayOfWeek.getDisplayName(TextStyle.FULL, Locale.US));
System.out.println(dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.US));
}
}
输出:
THURSDAY
Thursday
Thu
使用DateTimeFormatter
:
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
int day = 5;
int month = 8;
int year = 2010;
String sd = String.format("%02d", day) + "-" + String.format("%02d", month) + "-" + String.format("%04d", year);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate date = LocalDate.parse(sd, formatter);
DayOfWeek dayOfWeek = date.getDayOfWeek();
System.out.println(dayOfWeek);
System.out.println(dayOfWeek.getDisplayName(TextStyle.FULL, Locale.US));
System.out.println(dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.US));
}
}
输出:
THURSDAY
Thursday
Thu