69

我试过这个:

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 文档说我应该使用四个字符来匹配完整的形式。我只能在像“Jun”这样的缩写月份成功使用MMM ,但我需要匹配完整的形式。

文本:用于格式化,如果模式字母的数量为4个或更多,则使用完整的形式;否则,如果可用,则使用简短或缩写形式。对于解析,两种形式都被接受,与模式字母的数量无关。

https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

4

4 回答 4

150

您可能使用的语言环境中月份名称不是“January”、“February”等,而是您当地语言中的其他单词。

尝试指定您希望使用的语言环境,例如Locale.US

DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy", Locale.US);
Date d = fmt.parse("June 27,  2007");

此外,您在日期字符串中有一个额外的空格,但实际上这对结果没有影响。无论哪种方式都可以。

于 2010-02-08T01:43:26.463 回答
7

只是为了补充新的 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 方法已被弃用;-) 是时候继续前进了。

于 2015-03-12T13:41:26.447 回答
5

来自 java.time 的 LocalDate

使用LocalDatejava.time(现代 Java 日期和时间 API)作为日期

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MMMM d, u", Locale.ENGLISH);
    LocalDate date = LocalDate.parse("June 27, 2007", dateFormatter);
    System.out.println(date);

输出:

2007-06-27

正如其他人已经说过的那样,当您的字符串为英语时,请记住指定说英语的语言环境。ALocalDate是没有时间的日期,因此比旧Date类更适合字符串中的日期。尽管它的名字 aDate并不代表一个日期,而是一个时间点,它位于世界不同时区的至少两个不同的日期。

只有当您需要一个老式Date的 API 并且您现在无法升级到 java.time 时,才可以像这样转换:

    Instant startOfDay = date.atStartOfDay(ZoneId.systemDefault()).toInstant();
    Date oldfashionedDate = Date.from(startOfDay);
    System.out.println(oldfashionedDate);

在我的时区输出:

2007 年 6 月 27 日星期三 00:00:00 CEST

关联

Oracle 教程:日期时间解释如何使用 java.time。

于 2021-02-13T09:20:22.723 回答
-3
val currentTime = Calendar.getInstance().time
SimpleDateFormat("MMMM", Locale.getDefault()).format(date.time)
于 2020-01-13T15:24:18.090 回答