在查看此question时,我发现OP和已接受答案的代码在运行时会生成ParseException
。这是代码:
String dateString = new java.util.Date().toString();
System.out.println(dateString);
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
Date date = format.parse(dateString);
System.out.println(date.toString());
仔细检查打印的日期字符串与提供的格式有何不同之后,我仍然无法找到他们不匹配的原因。这是打印的日期字符串:
Sat Aug 19 18:58:41 BST 2017
我的直觉告诉我,这不起作用的原因是我的语言环境不同 - Locale.getDefualt()
返回ja_JP
。
答案 0 :(得分:1)
模式并不重要,但区域设置确实如此。
Date#toString
使用Locale.US
和英文名称表示日期,月份和时区,而SimpleDateFormat(String)
使用您的默认语言区域(具体为:Locale.getDefault(Locale.Category.FORMAT)
)。如果这两个语言环境不匹配,则解析可能会失败,因为不保证本地名称匹配。
所以你应该没事的
new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
摘自JDK 8:
的SimpleDateFormat:
public SimpleDateFormat(String pattern)
{
this(pattern, Locale.getDefault(Locale.Category.FORMAT));
}
日期:
public String toString() {
// "EEE MMM dd HH:mm:ss zzz yyyy";
BaseCalendar.Date date = normalize();
StringBuilder sb = new StringBuilder(28);
int index = date.getDayOfWeek();
if (index == BaseCalendar.SUNDAY) {
index = 8;
}
convertToAbbr(sb, wtb[index]).append(' '); // EEE
convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' '); // MMM
CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd
CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':'); // HH
CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
TimeZone zi = date.getZone();
if (zi != null) {
sb.append(zi.getDisplayName(date.isDaylightTime(), TimeZone.SHORT, Locale.US)); // zzz
} else {
sb.append("GMT");
}
sb.append(' ').append(date.getYear()); // yyyy
return sb.toString();
}
[...]
private final static String wtb[] = {
"am", "pm",
"monday", "tuesday", "wednesday", "thursday", "friday",
"saturday", "sunday",
"january", "february", "march", "april", "may", "june",
"july", "august", "september", "october", "november", "december",
"gmt", "ut", "utc", "est", "edt", "cst", "cdt",
"mst", "mdt", "pst", "pdt"