使用SimpleDateFormat在Java中格式化日期

时间:2018-03-09 05:56:48

标签: java date simpledateformat date-formatting date-parsing

我正在尝试将日期解析为适当的格式,但我不断收到错误

  

Unparseable date

谁能告诉我这是什么错误?

try {
    System.out.println(new SimpleDateFormat("d-MMM-Y").parse("05-03-2018").toString());
} catch (ParseException e) {
    e.printStackTrace();
}

我希望日期具有以下格式:

  

05-Mar-18

2 个答案:

答案 0 :(得分:2)

由于您要更改格式,请首先在String类型对象中读取并解析您自己格式的日期(来自Date)。然后通过使用SimpleDateFormat将其格式化为新的(所需)格式来使用该日期对象。

代码中的错误来自MMMYMMM是字符串中的月份,而您的输入是数值。另外,Y中的SimpleDateFormat是无效年份。 yy是需要添加的内容。

所以这是一个可以解决问题的代码。

SimpleDateFormat dateFormat = new SimpleDateFormat("d-MM-yyyy");
Date date = dateFormat.parse("05-03-2018");
dateFormat = new SimpleDateFormat("dd-MMM-yy");
System.out.println(dateFormat.format(date));

我希望这是你正在寻找的。

答案 1 :(得分:1)

有一些关于你应该注意的日期的概念。

日期代表日期的文字之间存在差异。

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

但是,同一日期可以以多种格式表示。它可以是“图形”,围绕一张纸上的数字以及某些特定顺序的许多其他数字形成的圆形,或者可以是纯文本,例如:< / p>

  • 09/03/2018(日/月/年)
  • 03/09/2018(monty / day / year)
  • 2018-03-09(ISO8601 format
  • March,9 th 2018
  • 9demarçode2018(葡萄牙语)
  • 2018年3月5日(日文)
  • 等......

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

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

使用java.time API(或版本低于8的respective backport),您可以使用更简单,更可靠的工具来处理日期。

在您的情况下,您有String(表示日期的文本),并且您希望将其转换为其他格式。您必须分两步完成:

  1. String转换为某种日期类型(将文本转换为数字日/月/年值) - 这称为解析
  2. 将此日期类型值转换为某种格式(将数值转换为特定格式的文字) - 称为格式
  3. 对于第1步,您可以使用LocalDate,一种代表日期(日,月,年,没有小时,没有时区)的类型,因为这就是您输入的内容:

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

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

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

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

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

    我怎么知道DateTimeFormatter必须使用哪些字母?好吧,我刚读过javadoc。许多开发人员忽略了文档,但我们必须养成检查它的习惯,特别是javadoc,它会告诉你像the difference between uppercase Y and lowercase y in SimpleDateFormat这样的东西。