Java的日期類(lèi)Date
Date類(lèi)
注意:是java.util.Date;
而非 java.sql.Date,此類(lèi)是給數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的時(shí)候使用的
示例 1 : 時(shí)間原點(diǎn)概念
所有的數(shù)據(jù)類(lèi)型,無(wú)論是整數(shù),布爾,浮點(diǎn)數(shù)還是字符串,最后都需要以數(shù)字的形式表現(xiàn)出來(lái)。
日期類(lèi)型也不例外,換句話(huà)說(shuō),一個(gè)日期,比如2020年10月1日,在計(jì)算機(jī)里,會(huì)用一個(gè)數(shù)字來(lái)代替。
那么最特殊的一個(gè)數(shù)字,就是零. 零這個(gè)數(shù)字,就代表Java中的時(shí)間原點(diǎn),其對(duì)應(yīng)的日期是1970年1月1日 8點(diǎn)0分0秒 。 (為什么是8點(diǎn),因?yàn)橹袊?guó)的太平洋時(shí)區(qū)是UTC-8,剛好和格林威治時(shí)間差8個(gè)小時(shí))
為什么對(duì)應(yīng)1970年呢? 因?yàn)?969年發(fā)布了第一個(gè) UNIX 版本:AT&T,綜合考慮,當(dāng)時(shí)就把1970年當(dāng)做了時(shí)間原點(diǎn)。
所有的日期,都是以為這個(gè)0點(diǎn)為基準(zhǔn),每過(guò)一毫秒,就+1。
示例 2 : 創(chuàng)建日期對(duì)象
package date;
//
import java.util.Date;
public class TestDate {
public static void main(String[] args) {
// 當(dāng)前時(shí)間
Date d1 = new Date();
System.out.println("當(dāng)前時(shí)間:");
System.out.println(d1);
System.out.println();
// 從1970年1月1日 早上8點(diǎn)0分0秒 開(kāi)始經(jīng)歷的毫秒數(shù)
Date d2 = new Date(5000);
System.out.println("從1970年1月1日 早上8點(diǎn)0分0秒 開(kāi)始經(jīng)歷了5秒的時(shí)間");
System.out.println(d2);
}
}
示例 3 : getTime
getTime() 得到一個(gè)long型的整數(shù)
這個(gè)整數(shù)代表 從1970.1.1 08:00:00:000 開(kāi)始 每經(jīng)歷一毫秒,增加1
直接打印對(duì)象,會(huì)看到 “Tue Jan 05 09:51:48 CST 2016” 這樣的格式
package date;
//
import java.util.Date;
public class TestDate {
public static void main(String[] args) {
//注意:是java.util.Date;
//而非 java.sql.Date,此類(lèi)是給數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的時(shí)候使用的
Date now= new Date();
//打印當(dāng)前時(shí)間
System.out.println("當(dāng)前時(shí)間:"+now.toString());
//getTime() 得到一個(gè)long型的整數(shù)
//這個(gè)整數(shù)代表 1970.1.1 08:00:00:000,每經(jīng)歷一毫秒,增加1
System.out.println("當(dāng)前時(shí)間getTime()返回的值是:"+now.getTime());
Date zero = new Date(0);
System.out.println("用0作為構(gòu)造方法,得到的日期是:"+zero);
}
}
示例 4 : System.currentTimeMillis()
當(dāng)前日期的毫秒數(shù)
new Date().getTime() 和 System.currentTimeMillis() 是一樣的
不過(guò)由于機(jī)器性能的原因,可能會(huì)相差幾十毫秒,畢竟每執(zhí)行一行代碼,都是需要時(shí)間的
package date;
//
import java.util.Date;
public class TestDate {
public static void main(String[] args) {
Date now= new Date();
//當(dāng)前日期的毫秒數(shù)
System.out.println("Date.getTime() \t\t\t返回值: "+now.getTime());
//通過(guò)System.currentTimeMillis()獲取當(dāng)前日期的毫秒數(shù)
System.out.println("System.currentTimeMillis() \t返回值: "+System.currentTimeMillis());
}
}
練習(xí): 日期
借助隨機(jī)數(shù),創(chuàng)建一個(gè)從1995.1.1 00:00:00 到 1995.12.31 23:59:59 之間的隨機(jī)日期
答案:
package date;
import java.util.Date;
public class TestDate {
public static void main(String[] args) {
long second = 1000;
long minute = 60*second;
long hour = minute * 60;
long day = hour*24;
long year = day * 365;
long year1995Start = (1995-1970) * year;
long leapDay = (1995-1970)/4*day; //每隔4年有一個(gè)潤(rùn)日
year1995Start+=leapDay;
long eightHour = hour*8; //8個(gè)小時(shí)的毫秒數(shù),因?yàn)閺?毫秒對(duì)應(yīng)的是1970.1.1 08:00:00
year1995Start-=eightHour;
Date dStart = new Date(year1995Start);
System.out.println("1995年第一天:"+dStart);
long year1995End = year1995Start + year - 1;
Date dEnd = new Date(year1995End);
System.out.println("1995年最后一天:"+dEnd);
long randomTime = (long) (Math.random()*(year-1) + year1995Start);
Date dRandom = new Date(randomTime);
System.out.println("1995年這一年中的一個(gè)隨機(jī)時(shí)間:" + dRandom);
}
}