如何使用 Java 中的 DateFormat 解析月份完整形式字符串?

发布于 2024-08-20 13:37:30 字数 678 浏览 7 评论 0原文

我尝试了这个:

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

error:

Exception in thread "main" java.text.ParseException: Unparseable date: "June 27, 2007"

java 文档说我应该使用四个字符来匹配完整的形式。 我只能成功使用 MMM 和诸如 “Jun” 之类的缩写月份,但我需要匹配完整形式。

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

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

I tried this:

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

error:

Exception in thread "main" java.text.ParseException: Unparseable date: "June 27, 2007"

The java docs say I should use four characters to match the full form.
I'm only able to use MMM successfully with abbreviated months like "Jun" but i need to match full form.

Text: For formatting, if the number
of pattern letters is 4 or more, the
full form is used; otherwise a short
or abbreviated form is used if
available. For parsing, both forms are
accepted, independent of the number of
pattern letters.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

荭秂 2024-08-27 13:37:30

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

尝试指定您希望使用的区域设置,例如 Locale.US

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

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

You are probably using a locale where the month names are not "January", "February", etc. but some other words in your local language.

Try specifying the locale you wish to use, for example Locale.US:

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

Also, you have an extra space in the date string, but actually this has no effect on the result. It works either way.

云仙小弟 2024-08-27 13:37:30

java.time 中的 LocalDate

使用 java.time(现代 Java 日期和时间 API)中的 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 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

链接

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

LocalDate from java.time

Use LocalDate from java.time, the modern Java date and time API, for a date

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

Output:

2007-06-27

As others have said already, remember to specify an English-speaking locale when your string is in English. A LocalDate is a date without time of day, so a lot better suitable for the date from your string than the old Date class. Despite its name a Date does not represent a date but a point in time that falls on at least two different dates in different time zones of the world.

Only if you need an old-fashioned Date for an API that you cannot afford to upgrade to java.time just now, convert like this:

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

Output in my time zone:

Wed Jun 27 00:00:00 CEST 2007

Link

Oracle tutorial: Date Time explaining how to use java.time.

快乐很简单 2024-08-27 13:37:30

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

Just to top this up to the new 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));

A bit more verbose but you also see that the methods of Date used are deprecated ;-) Time to move on.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文