Joda-Time 接受短格式(在大多数语言中,通常为 3 个字母)或长格式(全名)的月份名称。您的输入似乎是英文且包含 4 个字母,这是不受支持的。
如果可以操纵输入,您可以删除多余的字符并确保月份名称仅包含 3 个字母。
我还使用java.util.Locale 来指定月份名称为英文。如果不指定区域设置,则使用系统默认设置,并且不保证始终为英文,因此最好指定一个。
我还将它解析为LocalDate,因为它的toString() 方法已经产生了你想要的输出:
String input = "2017-Sept-14";
input = input.replace("Sept", "Sep");
DateTimeFormatter dateTimeFormat = DateTimeFormat.forPattern("yyyy-MMM-dd").withLocale(Locale.ENGLISH);
LocalDate dateTime = dateTimeFormat.parseLocalDate(input);
System.out.println(dateTime);
输出是:
2017-09-14
我假设语言环境是英语,但在爱沙尼亚语言环境中,九月的短月份名称是“sept”,所以您也可以这样做:
String input = "2017-Sept-14";
input = input.toLowerCase(); // et_EE locale accepts only "sept"
DateTimeFormatter dateTimeFormat = DateTimeFormat.forPattern("yyyy-MMM-dd")
.withLocale(new Locale("et", "EE"));
LocalDate dateTime = dateTimeFormat.parseLocalDate(input);
System.out.println(dateTime);
或者您可以尝试使用系统的默认设置(基于您的 cmets,SimpleDateFormat 与法语语言环境一起使用,因此上述代码也有可能也可以使用)。
Java 新的日期/时间 API
Joda-Time 处于维护模式,正在被新的 API 取代,因此我不建议使用它来启动新项目。即使在joda's website 中它说:“请注意,Joda-Time 被认为是一个基本上“完成”的项目。没有计划进行重大改进。如果使用 Java SE 8,请迁移到 java.time (JSR-310 )。”。
如果您不能(或不想)从 Joda-Time 迁移到新的 API,您可以忽略此部分。
在 Android 中,您可以使用 ThreeTen Backport,这是 Java 8 新日期/时间类的一个很好的反向移植。为了让它工作,你还需要ThreeTenABP(更多关于如何使用它here)。
您可以创建格式化程序,设置语言环境并将其解析为LocalDate:
import org.threeten.bp.LocalDate;
import org.threeten.bp.format.DateTimeFormatter;
import org.threeten.bp.format.DateTimeFormatterBuilder;
DateTimeFormatter f = new DateTimeFormatterBuilder()
// case insensitive (so it accepts Sept, sept, and so on)
.parseCaseInsensitive()
// pattern
.appendPattern("yyyy-MMM-dd")
// set locale
.toFormatter(new Locale("et", "EE"));
System.out.println(LocalDate.parse("2017-Sept-14", f));
输出是:
2017-09-14
或者只是尝试使用系统的默认语言环境(只需不带参数调用toFormatter(),它将使用系统默认设置)。
(可选)您可以创建自定义月份名称的地图并在格式化程序中使用它。唯一的细节是你必须用所有月份的值来填充它。我在九月输入了Sept,其他月份你可以相应地填写:
// map of custom names for month
Map<Long, String> monthNames = new HashMap<>();
// put the names used in your input
monthNames.put(1L, "Jan");
monthNames.put(2L, "Feb");
monthNames.put(3L, "Mar");
monthNames.put(4L, "Apr");
monthNames.put(5L, "May");
monthNames.put(6L, "Jun");
monthNames.put(7L, "Jul");
monthNames.put(8L, "Aug");
monthNames.put(9L, "Sept");
monthNames.put(10L, "Oct");
monthNames.put(11L, "Nov");
monthNames.put(12L, "Dec");
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
// case insensitive (so it accepts Sept, sept, and so on)
.parseCaseInsensitive()
// year
.appendPattern("yyyy-")
// month, using custom names
.appendText(ChronoField.MONTH_OF_YEAR, monthNames)
// day
.appendPattern("-dd")
// create formatter
.toFormatter();
String input = "2017-Sept-14";
System.out.println(LocalDate.parse(input, fmt));