无法使用 Dutch Day month year String 初始化 Joda DateTime

Cannot initialize Joda DateTime with Dutch Day month year String

import org.joda.time.DateTime;

public static void main(String[] args) {
    DateTimeFormatter f = DateTimeFormat.forPattern("dd MMM yyyy");
    f = f.withLocale(Locale.US);
    f.parseDateTime("13 januari 2016");

    DateTime date = new DateTime(f);
    date.getDayOfYear();
}

月份是荷兰语,不是英语。

输出:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "13 januari 2016" is malformed at "uari 2016"
at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:899)
at com.company.Main.main(Main.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

如何正确初始化这个 Joda DateTime? 非常感谢你们!

为您期望的语言检索适当的 Locale。用它来构造具有适当模式的 DateTimeFormat 。然后解析你的日期字符串。

例如

Locale dutch = Locale.forLanguageTag("nl-nl");
DateTimeFormatter f = DateTimeFormat.forPattern("dd MMM yyyy").withLocale(dutch);
DateTime date = f.parseDateTime("13 januari 2016");

我不知道你想用什么做

DateTime date = new DateTime(f);

那个 DateTime 构造函数需要一个 Object 代表一个瞬间。

The recognised object types are defined in ConverterManager and include ReadableInstant, String, Calendar and Date. The String formats are described by ISODateTimeFormat.dateTimeParser().

DateTimeFormat 两者都不是。

Joda-Time 处于维护模式

是正确的。但请注意,Joda-Time 项目现在处于维护模式,其团队建议迁移到 java.time classes.

使用java.time

LocalDate class 表示没有时间和时区的仅日期值。

解析字符串时,指定Locale确定:

  • 翻译日名、月名等的人类语言。
  • 决定缩写、大写、标点符号、分隔符等问题的文化规范。

您可以让 java.time 自动本地化,而不是明确指定格式模式。要本地化,请指定 FormatStyle 以确定字符串的长度或缩写。

String input = "13 januari 2016";
Locale l = new Locale ( "nl", "NL" );  // Dutch language, Netherlands country.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( l );
LocalDate ld = LocalDate.parse ( input, f );

转储到控制台。

System.out.println ( "input: " + input );
System.out.println ( "ld.toString(): " + ld );

input: 13 januari 2016

ld.toString(): 2016-01-13


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.