js時間Date對象介紹及解決getTime轉換爲8點的問題

前言函數

  在作時間轉換的時候,發現用「2016-04-12」轉出來的時間戳是 2016-04-12 08:00的時間點,而不是0點。spa

new Date('2016-04-12').getTime();
// 1460419200000
 
new Date(1460419200000);
// Tue Apr 12 2016 08:00:00 GMT+0800

  最後發現,若是將日期格式換成「2016/04/12」,則正常換算成0點。code

new Date(new Date('2016/04/12').getTime());
// Tue Apr 12 2016 00:00:00 GMT+0800

概述對象

  Date對象是JavaScript提供的日期和時間的操做接口。它有多種用法。接口

  JavaScript內部,全部日期和時間都儲存爲一個整數,表示當前時間距離1970年1月1日00:00:00的毫秒數,正負的範圍爲基準時間先後各1億天。ip

Date()

  做爲一個函數,Date對象能夠直接調用,返回一個當前日期和時間的字符串。字符串

Date()
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
 
Date(2000, 1, 1)
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"

  上面代碼說明,不管有沒有參數,直接調用Date老是返回當前時間。get

new Date()

  Date對象仍是一個構造函數,對它使用new命令,會返回一個Date對象的實例。若是不加參數,生成的就是表明當前時間的對象。string

var today = new Date();
 
today
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
 
// 等同於
today.toString()
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"

  做爲構造函數時,Date對象能夠接受多種格式的參數。io

  (1)new Date(milliseconds)

  Date對象接受從1970年1月1日00:00:00 UTC開始計算的毫秒數做爲參數。這意味着若是將Unix時間戳做爲參數,必須將Unix時間戳乘以1000。

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)

  上面代碼說明,Date構造函數的參數能夠是一個負數,表示1970年1月1日以前的時間。Date對象可以表示的日期範圍是1970年1月1日先後各一億天。

  (2)new Date(datestring)

  Date對象還接受一個日期字符串做爲參數,返回所對應的時間。 

new Date("January 6, 2013");
// Sun Jan 06 2013 00:00:00 GMT+0800 (CST)

  

  日期字符串的完整格式是「Month day, year hours:minutes:seconds」,好比「December 25, 1995 13:30:00」。若是省略了小時、分鐘或秒數,這些值會被設爲0。

  可是,其餘格式的日期字符串,也能夠被解析。事實上,全部能夠被Date.parse()方法解析的日期字符串,均可以看成Date對象的參數

new Date("2013-2-15")
new Date('2013/2/15')
new Date("2013-FEB-15")
new Date("FEB, 15, 2013")
new Date("FEB 15, 2013")
new Date("Feberuary, 15, 2013")
new Date("Feberuary 15, 2013")
new Date("15, Feberuary, 2013")
 
// Fri Feb 15 2013 00:00:00 GMT+0800 (CST)

  上面多種日期字符串的寫法,返回的都是同一個時間。

  注意,在ES5之中,若是日期採用連詞線(-)格式分隔,且具備前導0,JavaScript會認爲這是一個ISO格式的日期字符串,致使返回的時間是以UTC時區計算的。  

new Date('2014-01-01')
// Wed Jan 01 2014 08:00:00 GMT+0800 (CST)
 
new Date('2014-1-1')
// Wed Jan 01 2014 00:00:00 GMT+0800 (CST)

  上面代碼中,日期字符串有沒有前導0,返回的結果是不同的。若是沒有前導0,JavaScript引擎假設用戶處於本地時區,因此本例返回0點0分。若是有前導0(即若是你以ISO格式表示日期),就假設用戶處於格林尼治國際標準時的時區,因此返回8點0分。可是,ES6改變了這種作法,規定凡是沒有指定時區的日期字符串,一概認定用戶處於本地時區。

  對於其餘格式的日期字符串,一概視爲非ISO格式,採用本地時區做爲計時標準。

new Date('2014-12-11')
// Thu Dec 11 2014 08:00:00 GMT+0800 (CST)
 
new Date('2014/12/11')
// Thu Dec 11 2014 00:00:00 GMT+0800 (CST)

  上面代碼中,第一個日期字符串是ISO格式,第二個不是。

  (3)new Date(year, month [, day, hours, minutes, seconds, ms])

  Date對象還能夠接受多個整數做爲參數,依次表示年、月、日、小時、分鐘、秒和毫秒。若是採用這種格式,最少須要提供兩個參數(年和月),其餘參數都是可選的,默認等於0。由於若是隻使用「年」這一個參數,Date對象會將其解釋爲毫秒數。

new Date(2013)
// Thu Jan 01 1970 08:00:02 GMT+0800 (CST)

  上面代碼中,2013被解釋爲毫秒數,而不是年份。

  其餘狀況下,被省略的參數默認都是0。

new Date(2013, 0)
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
 
new Date(2013, 0, 1)
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
 
new Date(2013, 0, 1, 0)
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
 
new Date(2013, 0, 1, 0, 0, 0, 0)
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)

  上面代碼(除了第一行)返回的是2013年1月1日零點的時間,能夠看到月份從0開始計算,所以1月是0,12月是11。可是,月份裏面的天數從1開始計算。

這些參數若是超出了正常範圍,會被自動折算。好比,若是月設爲15,就折算爲下一年的4月。

new Date(2013, 15)
// Tue Apr 01 2014 00:00:00 GMT+0800 (CST)
 
new Date(2013,0,0)
// Mon Dec 31 2012 00:00:00 GMT+0800 (CST)

  參數還可使用負數,表示扣去的時間。

new Date(2013, -1)
// Sat Dec 01 2012 00:00:00 GMT+0800 (CST)
 
new Date(2013, 0, -1)
// Sun Dec 30 2012 00:00:00 GMT+0800 (CST)

  上面代碼分別對月和日使用了負數,表示從基準日扣去相應的時間。

  年的狀況有所不一樣,若是爲0,表示1900年;若是爲1,就表示1901年;若是爲負數,則表示公元前。

new Date(0, 0)
// Mon Jan 01 1900 00:00:00 GMT+0800 (CST)
 
new Date(1, 0)
// Tue Jan 01 1901 00:00:00 GMT+0800 (CST)
 
new Date(-1, 0)
// Fri Jan 01 -1 00:00:00 GMT+0800 (CST)

日期的運算

  類型轉換時,Date對象的實例若是轉爲數值,則等於對應的毫秒數;若是轉爲字符串,則等於對應的日期字符串。因此,兩個日期對象進行減法運算,返回的就是它們間隔的毫秒數;進行加法運算,返回的就是鏈接後的兩個字符串。

var d1 = new Date(2000, 2, 1);
var d2 = new Date(2000, 3, 1);
 
d2 - d1
// 2678400000
 
d2 + d1
// "Sat Apr 01 2000 00:00:00 GMT+0800 (CST)Wed Mar 01 2000 00:00:00 GMT+0800 (CST)"

 

ps:

1.轉換成形如 ‎2019‎年‎1‎月‎1‎日‎ ‎18‎:‎00‎:‎00 格式:

function getDate(date){ 
    var t = new Date(date).toLocaleString(); 
    return t; 
}

2.還能夠這樣

// 也很簡單
var strtime = '2019-01-01 18:00:00:123';
var date = new Date(strtime.replace(/-/g, '/'));
相關文章
相關標籤/搜索