Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SimpleDataFormat在Java中格式化日期_Java_Date_Simpledateformat_Date Formatting_Date Parsing - Fatal编程技术网

使用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如何处理这些概念

  • 文本由
    字符串
    表示。这个类只包含一系列字符。这些字符可以代表任何东西;在这种情况下,这是一个日期
  • 日期最初由
    java.util.date
    表示,然后由
    java.util.Calendar
    表示,但是如果可能,您应该避免使用它们
使用
java.time
API(或低于8的版本),您可以使用更简单、更可靠的工具来处理日期

在您的例子中,您有一个
字符串
(表示日期的文本),您希望将其转换为另一种格式。您必须分两个步骤执行此操作:

  • 字符串
    转换为某种日期类型(将文本转换为数字日/月/年值)-这称为解析
  • 将此日期类型值转换为某种格式(将数值转换为特定格式的文本)-这称为格式设置
  • 对于步骤1,您可以使用
    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,让基础知识变得清晰不会太麻烦。