5
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 之间的区别?

4

7 回答 7

12

这一行:

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

...不做你想做的事。这将创建一个Date对象,该对象表示3913年11 月1 日,当地时间 11:06。我不认为那是你想要的。

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

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

构造函数被弃用是有原因的——你应该注意弃用以及文档

现在您可以改用- 但如果可能的话,java.util.Calendar我实际上建议您改用Joda Time 。java.util.Calendar这是一个比/干净得多的 API Date。或者,如果您可以使用具有新 JSR-320 日期/时间 API 的 Java 8 的预发布版本。

于 2013-10-01T05:46:40.137 回答
2

奇怪的是,月份是从零开始的,所以构造函数中的 10 实际上是第 11 个月!

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

javadoc

year - 减去 1900 的年份。

月 - 0-11 之间的月份。

于 2013-10-01T05:46:50.143 回答
2

尝试

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

你会看到错误。

根据 thsi deprecated API 的 javadocs,年份 - 年份减去 1900

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

于 2013-10-01T05:47:42.357 回答
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 的 Date

于 2013-10-01T05:47:48.333 回答
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.

在第二次约会中,您也错过了毫秒

于 2013-10-01T05:48:12.897 回答
0

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

所以在你的情况下,如果你想要 2013 年,你应该通过113

来自 java docs日期类

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

参数:
year - 年份减去 1900。month
- 0-11 之间的月份。
日期 - 1-31 之间的月份中的日期。
hrs - 0-23 之间的小时数。
min - 0-59 之间的分钟数。

于 2013-10-01T05:49:43.367 回答
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 = new Date(113, 9, 1, 11, 6);

于 2013-10-01T05:55:35.020 回答