關於JS的Date你所要知道的二三事

  半個多月沒更新博文了……鬼知道我經歷了什麼。連續十幾天的班趕項目,在五一加班兩天後,終於閒暇一會,整理一下前些時間項目所用到的Date對象進行處理的知識點。

Date

  Date是JavaScript中一個原生構造函數,可以生成時間對象。但實際上可以使用非構造函數的方式來調用Date,此時生成的是一個當前時間的字符串。
  與其他原生構造函數不同,Date沒有字面量的聲明方法。

var newDateObject = new Date(); // Sat May 04 2019 19:21:19 GMT+0800 (中國標準時間)
typeof newDateObject;  // "object"

var unNewDate = Date(); //  "Sat May 04 2019 19:21:19 GMT+0800 (中國標準時間)"
typeof unNewDate; // "string"

Date作爲構造函數

  Date構造函數可以接受時間戳Date格式字符串數字類型的多個參數來生成你想要生成的時間的Date對象
  這裏的時間戳指的是從1970年1月1日00:00開始所經歷的毫秒數。比如new Date(0);生成的就是1970年1月1日00:00。值得一提的是,這裏原點時間是以格林尼治時間爲標準的,也就是當我們使用new Date(0);生成的實際上是作爲東八區偏移了8個小時的時間。可以使用setHours,把偏差的時間糾正回來。
  當你不傳入任何參數時,生成的是當前時間的時間對象。

var zeroPointDate = new Date(0); // Thu Jan 01 1970 08:00:00 GMT+0800 (中國標準時間) 此時時間已經偏移8個小時
zeroPointDate.setHours(0);
console.log(zeroPointDate); // Thu Jan 01 1970 00:00:00 GMT+0800 (中國標準時間)

  Date構造函數傳入字符串的時候,必須要是能被 Date.parse() 正確解析的字符串格式。
  Date構造函數傳入至少兩個數字類型參數的時候,會按照new Date(year, monthIndex, day, hours, minutes, seconds, milliseconds);的傳參模式進行解析。這裏之所以是monthIndex,是因爲在這裏month是從0開始計算的。當傳的參數不足數量的時候,未傳參的按照默認傳0來處理。除day外,day默認按照1來處理。
  實際上,當你傳入超出邊界的數字參數時,Date構造函數會幫你自動的計算成符合邊界的時間對象。比如你在第二個參數傳入12(即13月),會自動幫你生成第二年1月份時間的時間對象。可以利用這個特性,方便的計算天數匹配各個月份,不用再去根據不同月份匹配不同的天數啦。

// 傳入13月,會自動幫你計算到下一年的1月份
new Date(1970, 11); // Tue Dec 01 1970 00:00:00 GMT+0800 (中國標準時間)
new Date(1970, 12); // Fri Jan 01 1971 00:00:00 GMT+0800 (中國標準時間)

// 2月份並沒有30天, 自動計算到了3月份的2號
new Date(1970, 2, 30); // Mon Mar 02 1970 00:00:00 GMT+0800 (中國標準時間)

  Date當中嚴格一天的定位爲 86,400,000 毫秒。
  Date的構造函數以1970年1月1日00:00爲起始,能夠處理正負 100,000,000 天的時間數據,超出數據會生成一個錯誤對象。

new Date(0 + 100000000 * 86400000); // Sat Sep 13 275760 08:00:00 GMT+0800 (中國標準時間)
new Date(0 - 100000000 * 86400000); // Tue Apr 20 -271821 08:05:43 GMT+0805 (中國標準時間)

new Date(0 + 100000000 * 86400001); // Invalid Date
new Date(0 - 100000000 * 86400001); // Invalid Date

Date的prototype(Date的方法)和運算

  Date的方法可以分爲解析時間對象(get類)和操作時間對象(set類)兩大類。在設置時間對象的時候,不要忘了時間對象保存的本質是棧引用,即你操作一個時間對象後,所有引用這個時間對象的變量上的對象都會被改變。

解析時間對象(get類)

  簡而言之就是根據時間對象得到你所需要的各種值。

Date.prototype.getFullYear(); // 返回年份
Date.prototype.getMonth(); // 返回月份的index,即0表示1月份
Date.prototype.getDate(); // 返回幾號
Date.prototype.getDay(); // 返回第幾周
Date.prototype.getHours(); // 返回幾時
Date.prototype.getMinutes(); // 返回幾分鐘
Date.prototype.getSeconds(); // 返回第幾秒
Date.prototype.getMilliseconds(); //返回毫秒數
Date.prototype.getTime(); // 返回距1970年1月1日00:00 的時間戳, 在這之前的時間會用負值表示

操作時間對象(set類)

  設置時間對象的值,改變成你想要的時間。

Date.prototype.setFullYear(); // 設置當前時間對象的年份
Date.prototype.setMonth(); // 設置當前時間對象的月份的index,即0表示1月份
Date.prototype.setDate(); // 設置當前時間對象的日期
Date.prototype.setHours(); // 設置當前時間對象的小時
Date.prototype.setMinutes(); // 設置當前時間對象的分鐘
Date.prototype.setSeconds(); // 設置當前時間對象的秒
Date.prototype.setMilliseconds(); // 設置當前時間對象的毫秒數
Date.prototype.setTime(); // 根據時間戳重新設置當前時間對象

  操作時間對象遵從超出設置邊界自動計算的規則,因此可以方便的計算時間。

// 這裏寫一個能計算距今任意天數是幾月幾日的函數
function computedOffsetDaysToNow(days) {
    var date = new Date();
    var nowDate = date.getDate();
    date.setDate(days + nowDate);
    if (date.toString() === 'Invalid Date') {
        throw new Error('can\'t handler Invalid Date');
    }
    return date.getMonth() + 1 + '月' + date.getDate() + '號';
}
// 我寫這篇文章時是19年5月4日
computedOffsetDaysToNow(10); // "5月14號"
computedOffsetDaysToNow(100); // "8月12號"

時間對象的運算

  時間對象運算之間相減運算返回數字類型的毫秒數。

new Date(1970, 11, 2) - new Date(1970, 11, 1); // 86400000 此時也可以清楚的看到一天的毫秒數是86400000

  時間對象運算之間相加運算,符合JS的加法運算邏輯,對象相加時首先調用對象的 valueOf 方法,如果得到基本類型的值,那麼根據基本類型規則相加。valueOf總是返回對象自身,因此再調用對象的toString方法,時間對象相加得到的時間字符串的組合。

new Date(1970, 11, 2) + new Date(1970, 11, 1); // "Wed Dec 02 1970 00:00:00 GMT+0800 (中國標準時間)Tue Dec 01 1970 00:00:00 GMT+0800 (中國標準時間)"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章