Java DateFormat和SimpleDateFormat返回不正确的日期

时间:2010-02-10 00:44:16

标签: java date date-format simpledateformat

今天是2010年2月9日星期二,当我打印日期时,我的日期错误:

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());

打印行导致:“今天是2010年1月9日00:00:00 CST 2010”

肯定不是9月9日星期六,也就是2月9日星期二。我假设我做错了什么,所以有人能告诉我这里有什么问题吗?我是否必须手动设置星期几?

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

2 个答案:

答案 0 :(得分:9)

令人困惑的是,日历月数从0(1月)到11(12月),因此当您从日历中提取MONTH字段时,您将“2010-01-09”传递给formatter.parse()。

在相关的SO question中对此进行了讨论。

答案 1 :(得分: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();

这比String格式化/解析方法更有效,更不容易出错。

如果您可以使用JodaTime,这是一个非常优选的方法:

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