java - Simpledateformat 不可解析的日期

标签 java android date simpledateformat date-parsing

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

01/04/2018

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

我想将日期格式化为:

Sun 01 Apr 2018

我的代码如下:

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

这个输出:

Sun Apr 08 00:00:00 GMT+00:00 2018.

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

java.text.ParseException: Unparseable date: "01/04/2018"

最佳答案

其他答案解决了您的问题,但我认为了解一些概念以及您第一次尝试失败的原因很重要。

日期代表日期的文本是有区别的。

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

不过,同一日期可以用多种格式表示。它可以是“图形化的”,形式是在一张纸上用圆圈围绕一个数字,并以某种特定顺序排列许多其他数字,或者它可以是纯文本,例如:

  • 09/03/2018(日/月/年)
  • 03/09/2018(月/日/年)
  • 2018-03-09 ( ISO8601 format )
  • 2018 年 3 月
  • 2018 年 3 月 9 日(葡萄牙语)
  • 2018 年 3 月 5 日(日文)
  • 等等...

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

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

  • 文本由String 表示。这个类只包含一个字符序列,仅此而已。这些字符可以代表任何东西;在这种情况下,它是一个日期
  • 日期最初由 java.util.Date 表示,然后由 java.util.Calendar 表示,但是 those classes are full of problems如果可能的话,你应该避免使用它们。 Today we have a better API for that .

在 Android 中,您可以使用 java.time 类(如果您正在使用的 API 级别可用)或 threeten backport对于低于该级别的 API 级别(check here how to use it)。您将拥有更简单、更可靠的工具来处理日期。

在您的例子中,您有一个 String(表示日期的文本)并且您希望将其转换为另一种格式。您必须分两步完成:

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

为什么你的尝试没有奏效:

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

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

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

这比 SimpleDateFormat 更可靠,因为它解决了 lots of strange bugs and problems旧 API。

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

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

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

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

关于java - Simpledateformat 不可解析的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49192337/

相关文章:

java - Spring XML 错误 : Could not resolve placeholder 'cas.server.host'

java - HttpServletRequest 的属性字段如何映射到原始 HTTP 请求?

java - 将饼图分成相等的部分 jfreechart

java - 设计使用http请求的应用程序的方法

Android:按下后退按钮时如何使用 OnCreate()

java.lang.NoClassDefFoundError : Failed resolution of: Landroid/support/v4/graphics/ColorUtils;

android - 为什么 Fragment 在 .hide() 和 .setCustomAnimations() 上崩溃?

php - 如何根据 PHP 中输​​入的天数(例如 230、20 或 360 或任何天数)获取过去的日期(例如 2013-06-02)?

mysql - 在表 SQL 中生成日期

MySQL:是否可以在没有表的情况下对 'fill' 进行 SELECT?