java.util.Date类使用不同的方法为同一日期提供不同的输出

时间:2013-10-01 05:42:52

标签: java

public static void main(String[] args) throws ParseException {
    // create a date
    Date date = new Date();
    long diff = date.getTime();
    Date date1 = new Date(2013, 10, 1, 11, 6);
    long diff1 = date1.getTime();
    System.out.println("date is 1-10-2013, " + diff + " have passed.");
    System.out.println("date is 1-10-2013, " + diff1 + " have passed.");
}

,输出

date is 1-10-2013, 1380605909318 have passed.
date is 1-10-2013, 61341428160000 have passed.

任何人都能详细说明1380605909318和61341428160000之间的差异吗?

7 个答案:

答案 0 :(得分:12)

这一行:

Date date1 = new Date(2013, 10, 1, 11, 6);

......不做你做的事情。这会在当地时间晚上11:06创建一个Date对象,代表 11月年中第一个 3913 。我不认为这是你想要的。

事实上,如果您更改代码以包含日期本身而不是硬编码您认为正确值的内容,那么您将会看到:

System.out.println("date is " + date + ", " + diff + " have passed.");
System.out.println("date is " + date1 + ", " + diff1 + " have passed.");

建造者被弃用的原因是 - 你应该注意弃用,以及the documentation

现在你可以只使用java.util.Calendar - 但我实际上建议您使用Joda Time代替,如果可能的话。它比java.util.Calendar / Date更清晰,更清晰。或者,如果您可以使用具有新JSR-320日期/时间API的Java 8预发行版。

答案 1 :(得分:2)

奇怪的是,几个月基于零,所以构造函数中的10实际上是11月!

它并不止于此:一年是从1900年开始!

来自javadoc

  

年 - 减去1900年。

     

月 - 0-11之间的月份。

答案 2 :(得分:2)

尝试

System.out.println("date is 1-10-2013, " + diff + " have passed.");
System.out.println("date is " + date1.toString() + diff1 + " have passed.");  

你会看到错误。

根据不推荐使用的API的javadocs,年 - 年减去1900

http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#Date(int,int,int,int,int)

答案 3 :(得分:2)

只需添加此行

即可
System.out.println("date is 1-10-2013, " + new Date(diff1) + " have passed.");

您可以看到日期为Sat Nov 01 11:06:00 IST 3913

Date date1 = new Date(2013, 10, 1, 11, 6);不是你想象的那样。这就是为什么你不应该使用弃用的方法(这里的构造函数)。

正如 @JonSkeet 所提到的,强烈推荐Joda而不是Java's Date

答案 4 :(得分:0)

Date.getTime()以毫秒为单位返回日期和时间。

Javadoc说

 Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT
 represented by this Date object.

 @return  the number of milliseconds since January 1, 1970, 00:00:00 GMT
 represented by this date.

在第二个日期,你也错过了毫秒

答案 5 :(得分:0)

对于第二个日期对象,第一个参数采用(the year minus 1900)

因此,如果你想要2013年,你应该通过113

来自java docs Date class

public Date(int year,int month,int date,int hrs,int min)

参数:
年 - 减去1900年 月份 - 0-11之间的月份 date - 1-31之间的月份 小时 - 0-23之间的小时 min - 0-59之间的分钟。

答案 6 :(得分:0)

 @Deprecated
 public Date(int year,
                   int month,
                   int date,
                   int hrs,
                   int min)

Deprecated. As of JDK version 1.1, replaced by Calendar.set(year + 1900, month, date, hrs, min) or GregorianCalendar(year + 1900, month, date, hrs, min).

Allocates a Date object and initializes it so that it represents the instant at the start of the minute specified by the year, month, date, hrs, and min arguments, in the local time zone.

Parameters:
    year - the year minus 1900.
    month - the month between 0-11.
    date - the day of the month between 1-31.
    hrs - the hours between 0-23.
    min - the minutes between 0-59.

因此,如果您想获得相同或非常接近的结果,您必须使用以下

日期date1 =新日期(113,9,1,11,6);