以下Java代码使用2009-01-28-09:11:12
解析日期(包含时间部分)SimpleDateFormat
。我们来看看吧。
final public class Main
{
public static void main(String[] args)
{
try
{
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
Date d = df.parse("2009-01-28-09:11:12");
System.out.println(d);
}
catch (ParseException ex)
{
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
上述代码显示(解析后)的日期(时间)如下,
Sun Nov 30 22:07:51 IST 2008
即使我们正在尝试解析日期2009-01-28-09:11:12
。看起来有点不稳定。为什么要解析呢?
答案 0 :(得分:5)
您的日期格式不应该是这样的:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
匹配此格式:
Date d = df.parse("2009-01-28-09:11:12");
至于为什么,按照这个:
解析器实际上将这些视为数字,诀窍在于 - 是数字的一部分,代表负数。所以如果你这样做:
df.parse("2009-01-02-00:00:00")
它给出了:
Mon Dec 01 00:02:00 EST 2008
将2009解析为yyyy,然后将-0解析为MM(这是上个月从1开始的月份),然后是1作为dd等。
根据DateFormat中的解析:
默认情况下,解析是宽松的:如果输入不是此对象的格式方法使用的形式,但仍可以解析为日期,则解析成功。客户可以通过调用setLenient(false)坚持严格遵守格式。
我想,如果你有一个选项,如果你喜欢像2009/01/02 12:34:56这样的格式,最好使用斜线而不是破折号。这样:
df.parse("2009/01/02-00:00:00")
会抛出异常:
ERROR java.text.ParseException:
Unparseable date: "2009/01/02-00:00:00"
我只能得出结论,/
被DateFormat视为数字除法是一件非常好的事情......
答案 1 :(得分:2)
好吧,你可以定义你实际 解析的格式......
答案 2 :(得分:1)
默认情况下,以宽松模式解析日期。这意味着它可以容忍错误,例如如果它不是闰年那么将feb 29解析为mar 1。您要求它解析的是2009年第1个月的第28天,它尽职尽责地试图给您准确的要求。
要关闭此行为,请调用format.setLenient(false)。然后,如果您尝试解析不是真实日期的内容,则dateformat将抛出异常。