【问题标题】:SimpleDateFormat parsing date string incorrectlySimpleDateFormat 错误地解析日期字符串
【发布时间】:2014-03-05 20:52:05
【问题描述】:

我正在尝试将字符串解析为日期,然后将该日期格式化为不同的字符串格式以进行输出。

我的日期格式化代码如下:

SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat dateParser = new SimpleDateFormat("d/M/yyyy h:m:s a");
String formattedDocumentDate = dateFormatter.format(dateParser.parse(sysObj.getString("document_date")));

sysObj.getString("document_date") 的结果是1/31/2013 12:00:01 AM。当我检查formattedDocumentDate 的值时,我得到01/07/2015

非常感谢任何帮助。

【问题讨论】:

  • 1/31/2013 如何适应d/M/yyyy 日期格式?
  • 一个词:“宽松”(或 31-7=24 即 2 年)
  • 是的,从 2013 年初算起 31 个月,你最终会在 2015 年 7 月结束。我应该把它作为答案发布吗?
  • @DavidWallace 这就是答案,所以你应该去做;)

标签: java simpledateformat date-formatting


【解决方案1】:

您将 31 的天数解析为月数。 SimpleDateFormat 试图给你一个有效的日期。因此它增加了 2013 年 1 月 0 日 31 个月。这是2年零7个月。所以你得到你的结果01/07/2015。所以SimpleDateFormat 工作正常。

您的一个解决方案是将您的日期模式更改为 M/d/yyyy h:m:s a 或您的输入数据。

为避免这些尝试,您必须关闭SimpleDateFormat 宽松模式。然后如果格式不合适,你会得到一个异常。

【讨论】:

  • “美国日期格式” ...或:“为什么卫星会坠毁”
【解决方案2】:

看起来您的输入格式实际上是先是几个月,然后是几天。所以应该是“MM/dd/yyyy”。 所以:

SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/M/yyyy");
SimpleDateFormat dateParser = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");
String formattedDocumentDate = dateFormatter.format(dateParser.parse(sysObj.getString("document_date")));

【讨论】:

    【解决方案3】:

    另一个这样的例子

    SimpleDateFormat sdfInput = new SimpleDateFormat("yyyyMMdd");
    System.out.println("date is:"+new java.sql.Date( sdfInput.parse("20164129").getTime() ));
    

    输出为:2019-05-29

    我希望抛出解析异常,但不是 (41) 不是有效的月份值。 另一方面,如果我给20170229,系统可以识别2017年2月没有圈年并返回2017-03-01有趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      相关资源
      最近更新 更多