Joda-Time 接受短格式(在大多数语言中,通常为 3 个字母)或长格式(全名)的月份名称。您的输入似乎是英文且包含 4 个字母,这是不受支持的。
如果可以操纵输入,您可以删除多余的字符并确保月份名称仅包含 3 个字母。
我还使用 ajava.util.Locale
来指定月份名称为英文。如果不指定区域设置,则使用系统默认设置,并且不保证始终为英语,因此最好指定一个。
我还将它解析为 a 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);
或者您可以尝试使用系统的默认设置(根据您SimpleDateFormat
在法语语言环境下的注释,因此上面的代码也有可能也可以工作)。
Java 新的日期/时间 API
Joda-Time 处于维护模式,正在被新的 API 取代,所以我不建议用它开始一个新项目。即使在joda 的网站上,它也说:“请注意,Joda-Time 被认为是一个基本上‘完成’的项目。没有计划进行重大改进。如果使用 Java SE 8,请迁移到 java.time (JSR-310)。” .
如果您不能(或不想)从 Joda-Time 迁移到新 API,则可以忽略此部分。
在 Android 中,您可以使用ThreeTen Backport,它是 Java 8 新日期/时间类的一个很好的后向端口。要使其工作,您还需要ThreeTenABP(更多关于如何使用它的信息)。
您可以创建格式化程序,设置语言环境并将其解析为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));