用Java解析日历中的日期

用Java解析日历中的日期,java,parsing,date,calendar,Java,Parsing,Date,Calendar,我有以下功能 public static Date parseDate(String date, String format) throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat(format); return formatter.parse(date); } 我在我的代码中使用了如下内容 Calendar eDate = Calendar.getInstan

我有以下功能

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

这里有什么问题?

您当前正在使用
java.util.Date
中的默认格式进行格式化,然后使用可能不同的格式进行解析。您还应该更改格式字符串-它当前使用的是一个12小时的时钟,没有am/pm指示器,分钟两次。我想您的意思是:“yyyy-MM-dd-HH-MM-ss”

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


您可以使用
Date=calendar.getTime()然后通过
新的SimpleDataFormat(“yyyy-MM-dd-HH-MM-ss”)对其进行格式化。格式(日期)

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


编辑:

要以ISO样式格式在
eDate
中输出日期,请执行以下操作:

final DateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
String formattedDate = isoFormat.format(eDate.getTime());
这是未经测试的,但我认为它应该可以工作。

不要使用
toString()
进行类似的操作
toString()
应仅用于调试消息


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

您只需使用日历返回的日期,而不是将其转换为字符串并返回到日期(显然使用了错误的日期格式)。可通过以下方式获取日期:

eDate.getTime()

在您的情况下,似乎不需要SimpleDataFormat。

格式未存储在
日期中。它存储在
字符串中。
Date#toString()
返回一个固定的格式,该格式在其

仅在需要将
日期
显示为
字符串
时进行格式化

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
表示分钟。另请参见。

检查Date.toString()方法

api声明它以 格式:

dow mon dd hh:mm:ss zzz yyyy
即:

Mon Jan 28 14:22:07 EST 2004
您正在告诉解析器期望:
2004-01-2814-22-07

eDate.getTime().toString()
以以下格式返回日期的字符串表示形式:

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

您正在尝试使用以下格式分析日期:

yyyy mm dd hh mm ss


代码正确地抛出了ParseException。

这是它无法解析的日期“2010年7月21日7:24:07 PM”@Vishal:是的,这是因为您正在使用java.util.date.toString对其进行格式化。该日期可能无法解析。初始化(而不是构造)eDate可能会有所帮助。请阅读@Carl Smotricz的答案……但对于您的格式
“yyy-mm-dd-hh-mm-ss
您阅读的是分钟(mm)而不是月份(mm)…只是一个想法!哦,是的,但我尝试将其更改为MM,但出现了相同的错误。我修复了原始帖子中的格式字符串,以减少读者之间的混淆。运行了它。非常感谢:)使用了BaluC的解决方案
日历#getTime()
返回
java.util.Date
,不是
long
。我假设示例代码是一个测试用例,不是实际的生产代码。如果他的格式正确,它实际上是一个非常好的测试。您可以使用
Date-Date=calendar.getTime();
然后通过
新的SimpleDataFormat(“yyyy-MM-dd-HH-MM-ss”)对其进行格式化。format(date);
然后是解决下一步的时候了。你有一个日期,你想要一个字符串,在这一点上你想要使用
SimpleDataFormat.format()
。我将把它放在我的答案中……我不知道日历的一个对象被自动转换成了一个日期,使用getTime()+1