我试过了:
DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy");
Date d = fmt.parse("June 27, 2007");
错误:
Exception in thread "main" java.text.ParseException: Unparseable date: "June 27, 2007"
java文档说我应该使用四个字符来匹配完整的表单。 我只能使用 MMM 成功使用缩短的月份,例如“Jun”,但我需要匹配完整的表格。
文字:用于格式化,如果是数字 模式字母是4或更多, 使用完整形式;否则短 如果是,则使用缩写形式 可用。对于解析,两种形式都是 接受,独立于数量 模式字母。
http://java.sun.com/j2se/1.6.0/docs/api/java/text/SimpleDateFormat.html
答案 0 :(得分:114)
您可能正在使用月份名称不是“1月”,“2月”等的语言环境,而是使用您当地语言的其他一些词语。
尝试指定您要使用的区域设置,例如Locale.US
:
DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy", Locale.US);
Date d = fmt.parse("June 27, 2007");
此外,日期字符串中有一个额外的空格,但实际上这对结果没有影响。无论哪种方式都可以。
答案 1 :(得分:3)
使用现代 Java 日期和时间 API java.time 中的 LocalDate
来表示日期
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MMMM d, u", Locale.ENGLISH);
LocalDate date = LocalDate.parse("June 27, 2007", dateFormatter);
System.out.println(date);
输出:
<块引用>2007-06-27
正如其他人已经说过的,当您的字符串是英语时,请记住指定英语语言环境。 LocalDate
是没有时间的日期,因此比旧的 Date
类更适合字符串中的日期。尽管它的名字是 Date
,但它并不代表日期,而是一个时间点,该时间点位于世界不同时区的至少两个不同日期。
仅当您需要一个老式的 Date
用于您刚刚无法升级到 java.time 的 API 时,请按如下方式转换:
Instant startOfDay = date.atStartOfDay(ZoneId.systemDefault()).toInstant();
Date oldfashionedDate = Date.from(startOfDay);
System.out.println(oldfashionedDate);
在我的时区输出:
<块引用>2007 年 6 月 27 日星期三 00:00:00 CEST
Oracle tutorial: Date Time 解释如何使用 java.time。
答案 2 :(得分:2)
最重要的是新的Java 8 API:
DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("MMMM dd, yyyy").toFormatter();
TemporalAccessor ta = formatter.parse("June 27, 2007");
Instant instant = LocalDate.from(ta).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
Date d = Date.from(instant);
assertThat(d.getYear(), is(107));
assertThat(d.getMonth(), is(5));
有点冗长,但你也看到使用Date的方法已被弃用;-)继续前进的时间。
答案 3 :(得分:-1)
val currentTime = Calendar.getInstance().time
SimpleDateFormat("MMMM", Locale.getDefault()).format(date.time)