Simpledateformat无法解析的日期

Car*_*ers 4 java android date date-parsing simpledateformat

String在数据库(match.getDate)中具有以下日期格式:

01/04/2018

这是我要格式化的日期,存储为日/月/年。我想为我的Android应用设置格式。

我想将日期格式化为:

星期日2018年4月1日

我的代码如下:

SimpleDateFormat fDate = new SimpleDateFormat("dd/MM/yyyy");
try {
    textViewDate.setText(fDate.parse(match.getDate()).toString());
} catch (ParseException ex) {
    System.out.println(ex.toString());
}
Run Code Online (Sandbox Code Playgroud)

输出:

周日四月08 00:00:00 GMT + 00:00 2018。

我也尝试过"EE, MM d, yyyy",但是它给了我:

java.text.ParseException:无法解析的日期:“ 01/04/2018”

小智 6

其他答案解决了您的问题,但我认为了解一些概念以及为什么您的第一次尝试不起作用很重要。

日期表示日期文本之间存在差异。

示例:今天的日期是2018 年 3 月 9 日。该日期只是一个概念,是“我们日历系统中的特定点”的想法。

但是,相同的日期可以用多种格式表示。它可以是“图形化的”,形式是一张纸上的数字周围有许多其他数字以特定顺序排列的圆圈,也可以是纯文本,例如:

  • 09/03/2018(日/月/年)
  • 03/09/2018(月/日/年)
  • 2018-03-09 ( ISO8601 格式)
  • 2018 年3 月 9
  • 9 de março de 2018 (葡萄牙语)
  • 2018?3?5?(日语)
  • 等等...

请注意,文本表示不同,但它们都表示相同的日期(相同的值)。

考虑到这一点,让我们看看 Java 如何处理这些概念。

  • 文本由 a 表示String。这个类包含一个字符序列,仅此而已。这些字符可以代表任何东西;在这种情况下,这是一个约会
  • 日期最初由 表示java.util.Date,然后由 表示java.util.Calendar,但这些类充满问题,您应该尽可能避免使用它们。今天我们有一个更好的 API

在 Android 中,您可以使用在java.time您正在使用的 API 级别中可用的类,或者对于低于该级别的 API 级别的三个向后移植请在此处查看如何使用它)。您将拥有更简单、更可靠的工具来处理日期。

在您的情况下,您有一个String(代表日期的文本)并且您想将其转换为另一种格式。您必须分两步完成:

  1. 将 转换String为某种日期类型(将文本转换为数字日/月/年值) - 这称为解析
  2. 将此日期类型值转换为某种格式(将数值转换为特定格式的文本) - 这称为格式化

为什么您的尝试无效:

  • 第一次尝试给了您错误的格式,因为您调用了Date::toString()method,它以该格式 ( Sun Apr 08 00:00:00 GMT+00:00 2018)生成输出(文本表示)-因此解析正确,但格式不正确
  • 在第二次尝试中,您使用输出模式(EE dd MMM yyyy,您应该用于格式化的模式)来解析日期(导致ParseException)。

对于第 1 步,您可以使用 a LocalDate,一种表示日期(日、月和年,没有小时和时区)的类型,因为这就是您的输入:

String input = "01/04/2018";
DateTimeFormatter inputParser = DateTimeFormatter.ofPattern("dd/MM/yyyy");
// parse the input
LocalDate date = LocalDate.parse(input, inputParser);
Run Code Online (Sandbox Code Playgroud)

这比SimpleDateFormat因为它解决了旧 API 的许多奇怪的错误和问题更可靠。

现在我们有了我们的LocalDate对象,我们可以做第 2 步:

// convert to another format
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EE dd MMM yyyy", Locale.ENGLISH);
String output = date.format(formatter);
Run Code Online (Sandbox Code Playgroud)

请注意,我使用了一个java.util.Locale. 那是因为你想要的输出有英文的星期几和月份名称,如果你不指定语言环境,它将使用 JVM 的默认值(谁保证它总是英文?最好告诉API 您正在使用哪种语言而不是依赖于默认配置,因为这些可以随时更改,即使是在同一 JVM 中运行的其他应用程序)。

我怎么知道必须在 中使用哪些字母DateTimeFormatter?好吧,我刚刚阅读了javadoc


小智 5

使用我创建的此日期格式化程序方法

    public static String dateFormater(String dateFromJSON, String expectedFormat, String oldFormat) {
    SimpleDateFormat dateFormat = new SimpleDateFormat(oldFormat);
    Date date = null;
    String convertedDate = null;
    try {
        date = dateFormat.parse(dateFromJSON);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(expectedFormat);
        convertedDate = simpleDateFormat.format(date);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return convertedDate;
}
Run Code Online (Sandbox Code Playgroud)

并像这样调用此方法

dateFormater(" 01/04/2018" , "EE dd MMM yyyy" , "dd/MM/yyyy") 
Run Code Online (Sandbox Code Playgroud)

您将获得所需的输出