我正在尝试将日期解析为适当的格式,但我不断收到错误
Unparseable date
谁能告诉我这是什么错误?
try {
System.out.println(new SimpleDateFormat("d-MMM-Y").parse("05-03-2018").toString());
} catch (ParseException e) {
e.printStackTrace();
}
我希望日期具有以下格式:
05-Mar-18
答案 0 :(得分:2)
由于您要更改格式,请首先在String
类型对象中读取并解析您自己格式的日期(来自Date
)。然后通过使用SimpleDateFormat
将其格式化为新的(所需)格式来使用该日期对象。
代码中的错误来自MMM
和Y
。 MMM
是字符串中的月份,而您的输入是数值。另外,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));
我希望这是你正在寻找的。 p>
答案 1 :(得分:1)
有一些关于你应该注意的日期的概念。
日期与代表日期的文字之间存在差异。
示例:今天的日期 2018年3月9日。那个日期只是一个概念,是“我们日历系统中特定点”的概念。
但是,同一日期可以以多种格式表示。它可以是“图形”,围绕一张纸上的数字以及某些特定顺序的许多其他数字形成的圆形,或者可以是纯文本,例如:< / p>
请注意,文本表示形式不同,但它们都代表相同的日期(相同的值)。
考虑到这一点,让我们看看Java如何使用这些概念。
String
表示。该类包含一系列字符,仅此而已。这些角色可以代表什么;在这种情况下,这是一个日期java.util.Date
表示,然后由java.util.Calendar
表示,但是those classes are full of problems,如果可能,您应该避免使用它们。 Today we have a better API for that。使用java.time
API(或版本低于8的respective backport),您可以使用更简单,更可靠的工具来处理日期。
在您的情况下,您有String
(表示日期的文本),并且您希望将其转换为其他格式。您必须分两步完成:
String
转换为某种日期类型(将文本转换为数字日/月/年值) - 这称为解析 对于第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
这样的东西。