0

今天是 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());

打印行导致:“今天是 Sat Jan 09 00:00:00 CST 2010”

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

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

4

2 回答 2

9

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

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

于 2010-02-10T00:49:24.563 回答
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();
于 2010-02-10T20:34:43.200 回答