为什么此代码显示不同的日期?

时间:2010-03-03 10:50:39

标签: java date

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDemo {

    public static void main(String[] args) throws ParseException {

        SimpleDateFormat datef = new SimpleDateFormat("dd/mm/yyyy");

        Date date1 = new Date(2010, 03, 03) ;
        Date date2 = datef.parse("03/03/2010") ;

        System.out.println( date1 );
        System.out.println( date2 );
    }
}

提供以下输出:

Sun Apr 03 00:00:00 MST 3910

Sun Jan 03 00:03:00 MST 2010

为什么会给出不同的结果?

3 个答案:

答案 0 :(得分:3)

新日期(2010,03,03):

预计第一个参数为1900年,第二个为月(从0开始为1月),第三个参数为日

您输出的原因是“Sun Apr 03 00:00:00 MST 3910”=> constructor将1900添加到作为第一个参数传递的年份。 4月为第3指数。

不推荐使用此构造函数。

输出'Sun Jan 03 00:03:00 MST 2010'的原因:您没有使用正确的格式, 如果您使用“dd / MM / yyyy”,那么您将获得正确的输出。

希望这有帮助

答案 1 :(得分:2)

来自java来源:

@Deprecated
public Date(int year, int month, int date, int hrs, int min, int sec) {
    int y = year + 1900;
    // month is 0-based. So we have to normalize month to support Long.MAX_VALUE.
    if (month >= 12) {
        y += month / 12;
        month %= 12;
    } else if (month < 0) {
        y += CalendarUtils.floorDivide(month, 12);
        month = CalendarUtils.mod(month, 12);
    }
    BaseCalendar cal = getCalendarSystem(y);
    cdate = (BaseCalendar.Date) cal.newCalendarDate(TimeZone.getDefaultRef());
    cdate.setNormalizedDate(y, month + 1, date).setTimeOfDay(hrs, min, sec, 0);
    getTimeImpl();
    cdate = null;
}

如您所见,年份是一个棘手的参数。


顺便说一下,你使用八进制数字操作,但没有必要这样做,这会导致数字更高的错误。

答案 2 :(得分:1)

你有两个错误。

  1. 最后一篇文章回答了这个问题,但可能没有明确说明:要指定2010年,请将“110”作为参数。年份自1900年以来指定年份。

  2. 您的格式模式使用“mm”数月。这是几分钟的模式。改为使用“MM”。