【问题标题】:Parsing date from Calendar in Java从 Java 中的日历中解析日期
【发布时间】:2010-07-14 14:00:32
【问题描述】:

我有以下功能

public static Date parseDate(String date, String format) throws ParseException
 {
         SimpleDateFormat formatter = new SimpleDateFormat(format);
         return formatter.parse(date);
 }

我在我的代码中使用如下

Calendar eDate = Calendar.getInstance();
eDate.add(Calendar.DAY_OF_MONTH,10);
Date date = null;
  try {
   date = parseDate(eDate.getTime().toString(),"yyyy-MM-dd hh-mm-ss");
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

但它正在抛出 -

 java.text.ParseException: Unparseable date

这里有什么问题?

【问题讨论】:

  • 日期可能无法解析。初始化(而不是构建)eDate 可能会有所帮助。
  • 阅读@Carl Smotricz 的答案....但是对于"yyyy-mm-dd hh-mm-ss 的格式,您阅读的是分钟(mm)而不是月份(MM)...只是一个想法!
  • 糟糕:P 是的,但我尝试将其更改为 MM,但同样的错误即将到来
  • 我修复了原帖中的格式字符串,以减少读者之间的混淆。
  • 得到它运行的家伙。非常感谢 :) 使用 BaluC 的解决方案

标签: java parsing date calendar


【解决方案1】:

该格式未存储在Date 中。它存储在String 中。 Date#toString() 返回 fixed 格式,在其Javadoc 中进行了描述。

只进行格式化目前您需要将Date 显示为String

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, 10);
Date date = calendar.getTime();
String formattedDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
System.out.println(formattedDate);

请注意,MM 代表月份,mm 代表分钟。另见SimpleDateFormat javadoc

【讨论】:

  • 我不知道 Calendar 的一个对象是用 getTime() +1 自动转换成 Date 的
【解决方案2】:

您会很高兴听到永远不需要从Calendar 对象解析日期:从Calendar 中提取Date 的方法是通过getTime() 方法。


编辑:

以 ISO 样式格式以eDate 输出日期:

final DateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
String formattedDate = isoFormat.format(eDate.getTime());

这是未经测试的,但我认为它应该可以工作。

【讨论】:

  • 你可以使用Date date = calendar.getTime();然后通过new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(date);格式化
  • 那么是时候进行下一步了。你有一个日期,你想要一个字符串,此时你想在上面使用SimpleDateFormat.format()。我会把它放在我的答案中......
【解决方案3】:

您当前正在格式化 使用来自java.util.Date 的默认格式,然后解析 使用可能不同的格式。您还应该更改格式字符串 - 它目前使用 12 小时制,没有上午/下午指示符,分钟两次。我想你的意思是:“yyyy-MM-dd HH-mm-ss”

【讨论】:

  • 这是无法解析“Jul 21, 2010 7:24:07 PM”的日期
  • @Vishal:是的,那是因为您使用 java.util.Date.toString 对其进行格式化。
【解决方案4】:

不要将toString() 用于类似的事情。 toString() 只能用于调试消息。

使用DateFormat.format(..) 以可预测的形式生成字符串。

【讨论】:

    【解决方案5】:

    您正在插入 Zulu 时间戳 (UNIX),getTime() 返回自 January 1, 1970, 00:00:00 GMT 以来的毫秒数。然后将格式定义为yyyy-mm-dd hh-mm-ss 并尝试使用此模式解析时间戳。哪个不匹配。

    你可以使用Date date = calendar.getTime();,然后通过new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(date);格式化

    【讨论】:

      【解决方案6】:

      您可以简单地使用日历返回的日期,而不是将其转换为字符串再转换回日期(显然使用了错误的日期格式)。日期可以通过:

      eDate.getTime()
      

      您的情况似乎不需要 SimpleDateFormat。

      【讨论】:

      • Calendar#getTime() 返回 java.util.Date,而不是 long
      • 我假设示例代码是一个测试用例,而不是实际的生产代码。如果他的格式正确,这实际上是一个很好的测试。
      【解决方案7】:

      检查 Date.toString() 方法。

      api 声明它返回它 格式:

      dow mon dd hh:mm:ss zzz yyyy
      

      即:

      Mon Jan 28 14:22:07 EST 2004
      

      你告诉解析器期待:2004-01-28 14-22-07

      【讨论】:

        【解决方案8】:
        eDate.getTime().toString()
        

        以这种格式返回日期的字符串表示:

        dow mon dd hh:mm:ss zzz yyyy(参见 java.util.Date API)。

        您正在尝试使用此格式解析日期:

        yyyy-mm-dd hh-mm-ss .

        代码正确抛出 ParseException。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多