如何使用Java中的日期格式解析月份完整表单字符串?

时间:2010-02-08 01:31:43

标签: java simpledateformat

我试过了:

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

4 个答案:

答案 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.time 的 LocalDate

使用现代 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)