2010-02-10 92 views
0

今天是星期二,2010年2月9日的日期,当我打印的日期,我得到了错误的日期:Java的日期格式和SimpleDateFormat的返回是不正确

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 

Date today = formatter.parse(String.format("%04d-%02d-%02d", 
     Calendar.getInstance().get(Calendar.YEAR), 
     Calendar.getInstance().get(Calendar.MONTH), 
     Calendar.getInstance().get(Calendar.DAY_OF_MONTH))); 

System.out.println("Today is " + today.toString()); 

打印线的结果:“今天是星期六Jan 09 00:00:00 CST 2010“

这当然不是09年1月9日星期六,它是2009年2月9日星期二。我假设我做错了什么,所以有人可以让我知道这里有什么问题吗?我是否必须手动设置星期几?

更新 注:我今天不想来初始化new Date(),因为我想要的小时,分​​钟,秒和毫秒初始化为0。这是必要的,所以我可以将用户输入日期与今天进行比较:如果用户输入今天的日期,并使用格式化程序构建日期对象,那么如果我今天用new Date()进行初始化,并比较两个日期 - 今天将为用户选择的日期(这是不正确的)。因此,我需要在没有hr/min/sec/ms的情况下在今天开始时进行初始化。

+3

为什么地球上,你会得到“今天”呀?为什么不今天=新日期()?你的方式是漫长的,正如你所看到的,甚至是不正确的。 – duffymo 2010-02-10 01:02:51

+0

@duffymo 它在JSP中。假设用户选择今天作为他们想要的日子,那么他们的输入被转发到另一个JSP。我在第二个jsp初始化今天的日期之前记录了用户输入(使用新的Date(),它初始化为用户输入后的当前时间),所以今天将始终在用户选择日期之后,即使用户选择了同一天。因此,我需要今天进行初始化,并将hr/min/sec/ms保持为0. – Kiril 2010-02-10 19:43:40

+0

听起来像第二个JSP应该从第一个JSP的HTTP请求解析“today”,而不是调用“new Date”。如果答案很混乱,那是因为你的问题和要求也是如此。 – duffymo 2010-02-10 20:29:48

回答

9

令人困惑的是,日历个月从0(一月)到11(月)计算,所以你传递“2010-01-09”当你从日历中提取MONTH场formatter.parse()。

在相关的SO question中有对此的讨论。

+0

非常感谢! :) – Kiril 2010-02-10 00:57:13

3

如果你不想使用JodaTime你可以使用:

Calendar calendar = Calendar.getInstance(); 

calendar.set(Calendar.HOUR_OF_DAY, 0); 
calendar.set(Calendar.MINUTE, 0); 
calendar.set(Calendar.SECOND, 0); 
calendar.set(Calendar.MILLISECOND, 0); 

Date today = calendar.getTime(); 

这是更有效和更不容易出错比你的字符串格式化/解析方法。

如果你可以使用JodaTime这是一个很大的首选方法:

LocalDate date = new DateTime().toLocaleDate(); 
+0

谢谢mtpettyp!这看起来比我的好多了! :) – Kiril 2010-02-10 21:06:13

相关问题