DateUtils.parseDateStrictly("28 Sep 2018" , "dd MMMM yyyy")
上述日期的格式应该是 dd MMM yyyy (MMM 表示更短的月份),但是 MMMM 也会解析更短的月份,导致解析无效。我已经在使用 parseDateStrictly 方法。还有其他建议吗?
DateUtils.parseDateStrictly("28 Sep 2018" , "dd MMMM yyyy")
上述日期的格式应该是 dd MMM yyyy (MMM 表示更短的月份),但是 MMMM 也会解析更短的月份,导致解析无效。我已经在使用 parseDateStrictly 方法。还有其他建议吗?
我建议您将 java.time 用于您的日期和时间工作。DateUtils
一旦我们只有设计不佳的类Date
和可使用的类, Apache就很有用SimpleDateFormat
。我们不再需要它了。很长一段时间以来,我们都不需要它。
java.time 的行为方式与您期望的开箱即用方式一样。
DateTimeFormatter dateFormatter
= DateTimeFormatter.ofPattern("dd MMMM uuuu", Locale.ENGLISH);
String dateString = "28 Sep 2018";
LocalDate.parse(dateString, dateFormatter);
结果:
Exception in thread "main" java.time.format.DateTimeParseException: Text '28 Sep 2018' could not be parsed at index 3 at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046) at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948) at java.base/java.time.LocalDate.parse(LocalDate.java:428) (etc.)
Oracle 教程:日期时间解释如何使用 java.time。
列格式为 dd MMMM yyyy,它应该解析像 2018 年 9 月 28 日这样的日期,并且应该在 2018 年 9 月 28 日这样的值上抛出错误
DateUtils
使用日期时间 APIjava.util
及其格式化 API,SimpleDateFormat
这些 API 已过时且容易出错。我建议您应该完全停止使用它们并切换到现代日期时间 API。
使用现代日期时间 API:
import java.time.DateTimeException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
// Test strings
String[] arr = { "28 September 2018", "28 Sep 2018", "28 09 2018" };
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMMM uuuu", Locale.ENGLISH);
for (String s : arr) {
try {
LocalDate date = LocalDate.parse(s, formatter);
// ...Process date e.g.
System.out.println(DateTimeFormatter.ofPattern("MMMM dd, uuuu", Locale.ENGLISH).format(date));
} catch (DateTimeException e) {
System.out.println(s + " is not a valid string.");
}
}
}
}
输出:
September 28, 2018
28 Sep 2018 is not a valid string.
28 09 2018 is not a valid string.
在Trail: Date Time了解有关现代日期时间 API 的更多信息。
如果您正在为您的 Android 项目执行此操作,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring和How to use ThreeTenABP in Android Project检查Java 8+ APIs available。