使用SimpleDataFormat在Java中格式化日期
我试图将日期解析为适当的格式,但我不断收到错误使用SimpleDataFormat在Java中格式化日期,java,date,simpledateformat,date-formatting,date-parsing,Java,Date,Simpledateformat,Date Formatting,Date Parsing,我试图将日期解析为适当的格式,但我不断收到错误 不可解析日期 谁能告诉我是什么错误吗 try { System.out.println(new SimpleDateFormat("d-MMM-Y").parse("05-03-2018").toString()); } catch (ParseException e) { e.printStackTrace(); } 我希望日期采用以下格式: 2018年3月5日 由于要更改格式,请首先在日期类型对象中读取并解析自己格式的日期(从
不可解析日期
谁能告诉我是什么错误吗
try {
System.out.println(new SimpleDateFormat("d-MMM-Y").parse("05-03-2018").toString());
} catch (ParseException e) {
e.printStackTrace();
}
我希望日期采用以下格式:
2018年3月5日
由于要更改格式,请首先在
日期
类型对象中读取并解析自己格式的日期(从字符串
)。然后通过使用SimpleDataFormat
将该日期对象格式化为新的(所需的)格式来使用该日期对象
代码中的错误与MMM
和Y
有关MMM
是字符串中的月份,而您的输入是数值。加上SimpleDateFormat
中的Y
是无效年份<代码>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));
我希望这就是你想要的。有一些关于日期的概念你应该知道 日期与表示日期的文本之间存在差异 示例:今天的日期是2018年3月9日。那个日期只是一个概念,一个“我们日历系统中的一个特定点”的概念 但是,同一日期可以用多种格式表示。它可以是“图形化”的,在一张纸上以圆圈的形式围绕一个数字,并以特定的顺序排列许多其他数字,也可以是纯文本,例如:
- 2018年3月9日(日/月/年)
- 2018年9月3日(月/日/年)
- 2018-03-09()
- 2018年3月9日
- 2018年3月9日(葡萄牙语)
- 2018年年3.月5.日 (日语)
- 等等
- 文本由
表示。这个类只包含一系列字符。这些字符可以代表任何东西;在这种情况下,这是一个日期字符串
- 日期最初由
表示,然后由java.util.date
表示,但是如果可能,您应该避免使用它们李>java.util.Calendar
java.time
API(或低于8的版本),您可以使用更简单、更可靠的工具来处理日期
在您的例子中,您有一个字符串
(表示日期的文本),您希望将其转换为另一种格式。您必须分两个步骤执行此操作:
字符串
转换为某种日期类型(将文本转换为数字日/月/年值)-这称为解析LocalDate
,这是一种表示日期(日、月、年、无小时、无时区)的类型,因为这就是您的输入:
String input = "05-03-2018";
DateTimeFormatter inputParser = DateTimeFormatter.ofPattern("dd-MM-yyyy");
// parse the input
LocalDate date = LocalDate.parse(input, inputParser);
这比SimpleDataFormat更可靠,因为它解决了旧API的问题
现在我们有了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,它告诉您这样的事情。您希望日期看起来如何?您能提到您预期的输出示例日期吗?05-03-2018匹配你眼中的模式d-MMM-Y?你选择这种模式的依据是什么?不要随意尝试。阅读javadoc.MMM代表八月(八月),你有03(三月),要将MMM更改为MM,日期也必须设置为dd而不是d。@SafeerAnsari添加了预期的输出可能的副本。我建议,仅在您的情况下,使用LocalDate
而不是LocalDateTime
。此问题已被询问和回答过多次,因此也可以随意搜索其他答案。然后使用t他java.time
API;)@MadProgrammer是的,你确实是对的。只是不推荐它,因为对他来说,日期/时间格式的基础还不清楚。当然可以,但因为有一种趋势是不推荐API的整个部分,而且格式也没有什么不同;)同意@MadProgrammer,同意java.time,让基础知识变得清晰不会太麻烦。