代码之家  ›  专栏  ›  技术社区  ›  Kiril

JavaDeaFrand和SimpleDateFormat返回不正确的日期

  •  0
  • Kiril  · 技术社区  · 14 年前

    今天是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”

    最确定的不是2009年1月9日星期六,而是2009年2月9日星期二。我想我做错了什么,有人能告诉我这里出了什么事吗?我必须手动设置星期几吗?

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

    2 回复  |  直到 14 年前
        1
  •  9
  •   Community c0D3l0g1c    7 年前

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

    有一个相关的讨论 SO question .

        2
  •  3
  •   mtpettyp    14 年前

    如果不想使用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();