Android Java SimpleDateFormat 异常不正确



例如,我正在尝试确保用户输入正确的日期格式 10/08/2015。

try{
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
d = sdf.parse(date.getText().toString());
}catch(ParseException ex){
Toast.makeText(MainActivity.this,
"Date format is wrong.", Toast.LENGTH_LONG).show();
return;
}

但它仍然解析大多数错误的输入,如 111/10/2013 或11/109/2013 或一些包含字符的输入。

另一个问题是如何将 dd/mm/yyyy 类型日期转换为月份名称日、年字符串?

所以 01/04/2018 将转换为 Apr 1,2018

DateTimeFormatter enteredFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
DateTimeFormatter usDateFormatter = DateTimeFormatter
.ofLocalizedDate(FormatStyle.MEDIUM)
.withLocale(Locale.US);
LocalDate d;
try {
d = LocalDate.parse(date.getText(), enteredFormatter);
System.out.println(d.format(usDateFormatter));
} catch (DateTimeParseException dtpe) {
Toast.makeText(MainActivity.this,
"Date format is wrong.", Toast.LENGTH_LONG).show();
return;
}

从您的问题中获取不正确的日期 此代码将捕获java.time.format.DateTimeParseException: Text '111/10/2013' could not be parsed at index 2java.time.format.DateTimeParseException: Text '11/109/2013' could not be parsed at index 5,因此向用户提供错误消息。给定一个正确的日期字符串,如11/10/2013它打印如下:

10月 11, 2013

我还没有在Android上测试过的细节:据我了解,EditText.getText将返回一个Editable,它实现了CharSequence。由于LocalDate.parse接受CharSequence,因此无需.toString()即可通过date.getText()

在为受众设置日期格式时,您应该考虑的第一件事是使用该受众区域设置的 Java 内置格式化程序之一。您请求的格式与美国区域设置的MEDIUM格式一致。我认为这不是巧合。所以一定要利用。

同时我正在利用java.time,现代Java日期和时间API。SimpleDateFormat是出了名的麻烦和早已过时。我避免它。现代 API 使用起来要好得多。

问:我可以在 Android 上使用 java.time 吗?

是的,java.time在较旧和较新的Android设备上运行良好。它只需要至少Java6

  • 在Java 8及更高版本以及较新的Android设备上(我被告知从API级别26开始),现代API是内置的。
  • 在Java 6和7中获取ThreeTen Backport,新类的反向移植(JSR 310的ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android上使用Android版本的ThreeTen Backport。它被称为ThreeTenABP。并确保从带有子包的org.threeten.bp导入日期和时间类。

链接

  • Oracle 教程:解释如何使用java.time的日期时间。
  • Java 规范请求 (JSR) 310,其中首次描述了java.time
  • ThreeTen Backport 项目,将java.time向 Java 6 和 7 的反向移植(ThreeTen 用于 JSR-310)。
  • ThreeTenABP,ThreeTen Backport 的安卓版
  • 问:如何在Android项目中使用ThreeTenABP,并进行了非常详尽的解释。

相关内容

最新更新