【问题标题】:Why is this code displaying different dates?为什么此代码显示不同的日期?
【发布时间】:2010-03-03 10:50:38
【问题描述】:
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 );
    }
}

给出以下输出:

4 月 3 日星期日 00:00:00 MST 3910 2010 年 1 月 3 日星期日 00:03:00 MST

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

【问题讨论】:

标签: java date


【解决方案1】:

新日期(2010,03,03):

这需要第一个参数为 1900 年,第二个为月份(从 0 开始作为一月),第三个参数为天

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

已弃用此构造函数。

输出“Sun Jan 03 00:03:00 MST 2010”的原因:您使用的格式不正确, 如果你使用 "dd/MM/yyyy" 那么你会得到正确的输出。

希望对你有帮助

【讨论】:

    【解决方案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;
    }
    

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


    顺便说一句,您使用八进制数进行操作,但没有必要这样做,这会导致数字较大的错误。

    【讨论】:

    • 好一个罗马人。是的,永远不要在 Java 中编写以 0 开头的整数文字!正如你所说,这不是这里的错误,而是另一个等待发生的错误。
    • API 文档(又名 JavaDoc)不是更好的信息来源吗? java.sun.com/javase/6/docs/api/java/sql/…
    • @Joachim:恕我直言)
    • 部分。但其中一个是权威参考,另一个只是许多可能的实现之一。
    【解决方案3】:

    你有两个错误。

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

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

    【讨论】:

    • 另外:该构造函数中的月份从零开始。所以OP总共有3个错误。
    • @Sean Owen:即使这样也行不通:- SimpleDateFormat datef = new SimpleDateFormat("dd-MM-yyyy");日期 date1 = new Date(110, 3, 3) ;日期 date2 = datef.parse("3-3-2010") ;
    • @rits:将 JavaDoc 重新读取到您使用的 Date 构造函数(发布在我下面的其他评论中)并检查月份字段。另请阅读我上面的评论。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2020-07-20
    • 2011-07-29
    • 1970-01-01
    • 2020-12-11
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多