兩個基礎知識:
- JavaScript內的時間戳指的是當前時間到1970年1月1日00:00:00 UTC對應的毫秒數;
- 標準時間:
- GMT:格林威治標準時間,指位于英國倫敦郊區的皇家格林威治天文臺的標準時間,由于地球的自轉不規則,因此導致GMT時間有誤差;
- UTC:世界標準時間,
Date對象是JavaScript提供的日期和時間的操作接口。它可以表示的時間范圍是,1970年1月1日00:00:00前后的各1億天(單位為毫秒)。
Date()
對象可以作為普通函數直接調用,無論有沒有參數,總是返回當前時間。
new Date()
構造函數
日期對象的創建,使用new操作符和Date構造函數:
var now = new Date();
作為構造函數,如果不加參數,會返回代表當前時間的對象:
var now = new Date();
console.log(now);
// 2017-08-25T02:39:35.181Z
作為構造函數,Date()
對象可以接收多種格式參數:
new Date(milliseconds)
Date
對象接受從1970年1月1日00:00:00 UTC開始計算的毫秒數作為參數。這意味著如果將Unix時間戳(單位為秒)作為參數,必須將Unix時間戳乘以1000。
Date構造函數的參數可以是一個負數,表示1970年1月1日之前的時間。
new Date(1378218728000)
// Tue Sep 03 2013 22:32:08 GMT+0800 (CST)
// 1970年1月2日的零時
var Jan02_1970 = new Date(3600 * 24 * 1000);
// Fri Jan 02 1970 08:00:00 GMT+0800 (CST)
// 1969年12月31日的零時
var Dec31_1969 = new Date(-3600 * 24 * 1000);
// Wed Dec 31 1969 08:00:00 GMT+0800 (CST)
new Date(datestring)
Date對象還接受一個日期字符串作為參數,返回所對應的時間。所有可以被Date.parse()方法解析的日期字符串,都可以當作Date對象的參數。
new Date('January 6, 2013');
<!-- Date 2013-01-05T16:00:00.000Z -->
日期字符串的完整格式是“month day, year hours:minutes:seconds”,比如“December 25, 1995 13:30:00”。如果省略了小時、分鐘或秒數,這些值會被設為0。
new Date(year, month [, day, hours, minutes, seconds, ms])
在多個參數的情況下,Date對象將其分別視作對應的年、月、日、小時、分鐘、秒和毫秒。如果采用這種用法,最少需要指定兩個參數(年和月),其他參數都是可選的,默認等于0。如果只使用年一個參數,Date對象會將其解釋為毫秒數。
各個參數的取值范圍為:
- year:四位年份,如果寫成兩位數,則加上1900
- month:表示月份,0表示一月,11表示12月
- date:表示日期,1到31
- hour:表示小時,0到23
- minute:表示分鐘,0到59
- second:表示秒鐘,0到59
- ms:表示毫秒,0到999
上面的參數如果超出了范圍,那么將進行自動折算,比如月份為15,將折算為下一年的4月。
上面的參數如果為負數,表示從基準扣除的時間。
年份如果是0到99,會自動加上1900。比如,0表示1900年,1表示1901年;如果為負數,則表示公元前。
日期的運算
類型轉換時,Date對象的實例如果轉為數值,則等于對應的毫秒數;如果轉為字符串,則等于對應的日期字符串。所以,兩個日期對象進行減法運算,返回的就是它們間隔的毫秒數;進行加法運算,返回的就是連接后的兩個字符串。
var then = new Date(1993, 11, 02);
var now = new Date(2017, 8, 27);
console.log(now - then);
// 751680000000
console.log(now + then);
// Wed Sep 27 2017 00:00:00 GMT+0800 (CST)Thu Dec 02 1993 00:00:00 GMT+0800 (CST)?
Date對象的靜態方法
Date.now()
now方法返回當前距離1970年1月1日00:00:00的毫秒數(Unix時間戳乘以1000)。。
console.log(Date.now());
Date.parse()
parse方法用來解析日期字符串,返回距離1970年1月1日 00:00:00的毫秒數
日期字符串的格式應該完全或者部分符合YYYY-MM-DDTHH:mm:ss.sssZ格式,Z表示時區,是可選的
如果傳入Date.parse()
方法的字符串不能表示日期,返回NaN
默認情況下,Date對象返回的都是當前時區的時間。
Date.UTC()
返回UTC時間。該方法接受年、月、日等變量作為參數,返回當前距離1970年1月1日 00:00:00 UTC的毫秒數。
Date實例對象的方法
Date實例對象一般分為3類:
- to類:從Date對象返回一個字符串,表示指定的時間。
- get類:獲取Date對象的日期和時間。
- set類:設置Date對象的日期和時間。
to類方法
Date.prototype.toString()
返回一個完整的日期字符串。
var now = new Date(2017, 8, 27);
console.log(now);
// 2017-09-26T16:00:00.000Z
console.log(now.toString());
// Wed Sep 27 2017 00:00:00 GMT+0800 (CST)
Date.prototype.toUTCString()
返回對應的UTC時間,也就是時區時間。
var now = new Date(2017, 8, 27);
console.log(now);
// 2017-09-26T16:00:00.000Z
console.log(now.toUTCString());
// Tue, 26 Sep 2017 16:00:00 GMT
Date.prototype.toISOString()
返回對應時間的ISO8601寫法。返回的也是UTC時區時間。
var now = new Date(2017, 8, 27);
console.log(now);
// 2017-09-26T16:00:00.000Z
console.log(now.toISOString());
// 2017-09-26T16:00:00.000Z
Date.prototype.toJSON()
返回一個符合JSON格式的ISO格式的日期字符串,與toISOString方法的返回結果完全相同。
Date.prototype.toDateString()
返回日期字符串。
var now = new Date(2017, 8, 27);
console.log(now);
// 2017-09-26T16:00:00.000Z
console.log(now.toDateString());
// Wed Sep 27 2017
Date.prototype.toTimeString()
返回時間字符串。
var now = new Date(2017, 8, 27);
console.log(now);
// 2017-09-26T16:00:00.000Z
console.log(now.toTimeString());
// 00:00:00 GMT+0800 (CST)
Date.prototype.toLocaleDateString()
返回當地日期字符串。
var now = new Date(2017, 8, 27);
console.log(now);
// 2017-09-26T16:00:00.000Z
console.log(now.toLocaleDateString());
// 2017-9-27
get類方法
- getTime():返回距離1970年1月1日00:00:00的毫秒數,等同于valueOf方法。
- getDate():返回實例對象對應每個月的幾號(從1開始)。
- getDay():返回星期幾,星期日為0,星期一為1,以此類推。
- getYear():返回距離1900的年數。
- getFullYear():返回四位的年份。
- getMonth():返回月份(0表示1月,11表示12月)。
- getHours():返回小時(0-23)。
- getMilliseconds():返回毫秒(0-999)。
- getMinutes():返回分鐘(0-59)。
- getSeconds():返回秒(0-59)。
- getTimezoneOffset():返回當前時間與UTC的時區差異,以分鐘表示,返回結果考慮到了夏令時因素。
set類方法
- setDate(date):設置實例對象對應的每個月的幾號(1-31),返回改變后毫秒時間戳。
- setYear(year): 設置距離1900年的年數。
- setFullYear(year [, month, date]):設置四位年份。
- setHours(hour [, min, sec, ms]):設置小時(0-23)。
- setMilliseconds():設置毫秒(0-999)。
- setMinutes(min [, sec, ms]):設置分鐘(0-59)。
- setMonth(month [, date]):設置月份(0-11)。
- setSeconds(sec [, ms]):設置秒(0-59)。
- setTime(milliseconds):設置毫秒時間戳。
參考信息:《JavaScript 標準參考教程(alpha)》,by 阮一峰
小練習:
- 寫一個函數getChIntv,獲取從當前時間到指定日期的間隔時間
function getChIntv(datestr) {
var targetDate = new Date(datestr);
var curDate = new Date();
var offset = Math.abs(targetDate - curDate);
var totalSeconds = Math.floor(offset / 1000);
var second = totalSeconds % 60;
var totalMinutes = Math.floor(totalSeconds / 60);
var minute = totalMinutes % 60;
var totalHours = Math.floor(totalMinutes / 60);
var hours = totalHours % 24;
var days = Math.floor(totalHours / 24);
return targetDate.toLocaleDateString() + ' 距離現在:' + days + '天' + hours + '小時' + minute + '分鐘' + second + '秒';
}
var offectTime = getChIntv('2017, 7, 27');
console.log(offectTime);
// 2017-7-27 距離現在:31天13小時2分鐘3秒
- 把hh-mm-dd格式數字日期改成中文日期
function getChsDate(inputDate) {
var dict = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二", "十三", "十四", "十五", "十六", "十七",
"十八", "十九", "二十", "二十一", "二十二", "二十三", "二十四", "二十五", "二十六", "二十七", "二十八", "二十九", "三十",
"三十一"
];
var arr = inputDate.split('-'); // 從'-'處把字符串分割成字符串數組
// [ '2017', '08', '27' ]
var arrYear = arr[0].split(''); // 將年份分割成數組
// [ '2', '0', '1', '7' ]
var strYear = '';
for (var i = 0; i < 4; i++) {
strYear += dict[parseInt(arrYear[i])];
}
var strMonth = dict[parseInt(arr[1])];
var strDate = dict[parseInt(arr[2])];
return strYear + '年' + strMonth + '月' + strDate + '日';
}
var result = getChsDate('2017-08-27');
console.log(result);
- 寫一個函數,參數為時間對象毫秒數的字符串格式,返回值為字符串。假設參數為時間對象毫秒數t,根據t的時間分別返回如下字符串:
- 剛剛( t 距當前時間不到1分鐘時間間隔)
- 3分鐘前 (t距當前時間大于等于1分鐘,小于1小時)
- 8小時前 (t 距離當前時間大于等于1小時,小于24小時)
- 3天前 (t 距離當前時間大于等于24小時,小于30天)
- 2個月前 (t 距離當前時間大于等于30天小于12個月)
- 8年前 (t 距離當前時間大于等于12個月)
function pastTime(inputTime) {
var curTime = new Date();
var nowTime = curTime.getTime();
var offsetMinute = Math.floor((nowTime - inputTime) / 1000 / 60);
var offsetTime;
if (offsetMinute < 1) {
offsetTime = '剛剛';
} else if (offsetMinute < 60) {
offsetTime = offsetMinute + '分鐘前';
} else if (offsetMinute < 1440) {
offsetTime = Math.floor(offsetMinute / 60) + '小時前';
} else if (offsetMinute < 43200) {
offsetTime = Math.floor(offsetMinute / 60 / 24) + '天前';
} else if (offsetMinute < 518400) {
offsetTime = Math.floor(offsetMinute / 60 / 24 / 30) + '個月前';
} else {
offsetTime = Math.floor(offsetMinute / 60 / 24 / 30 / 12) + '年前';
}
return offsetTime;
}
var str = pastTime('1483200000000');
console.log(str);