(一) Date對象 概述
Date對象是JavaScript提供的日期和時間的操作接口。它可以表示的時間范圍是,1970年1月1日00:00:00前后的各1億天(單位為毫秒)。
(1)Date作為普通函數: Date() -------------------返回當前時間字符串
- Date對象可以作為普通函數直接調用,返回一個代表當前時間的字符串。
- Date對象作為普通函數使用時,即使帶有參數,返回的還是當前時間。
# Date對象作為普通函數,可以直接調用,返回當前時間字符串
Date()
// Sat Nov 18 2017 17:42:30 GMT+0800 (中國標準時間)
--------------------------------------
# 作為普通函數時,即使帶有參數,返回的還是當前時間
Date(2000, 1, 1)
// Sat Nov 18 2017 17:42:30 GMT+0800 (中國標準時間)
(2) Date作為構造函數: new Date()--------------------返回Date對象實例
- Date還可以當作構造函數使用。對它使用new命令,會返回一個Date對象的實例。如果不加參數,生成的就是代表當前時間的對象
- 這個Date實例對應的字符串值,就是當前時間。
var Today = new Date()
Today --------------------------------------------- // typeof是一個Object類型
等同于(相等)
today.toString()------------------------------------// typeof是一個String類型
最后的值都相等
// Sat Nov 18 2017 17:55:42 GMT+0800 (中國標準時間)
作為構造函數時,Date對象可以接受多種格式的參數。
[1] new Date(datestring)
Date對象接受一個日期字符串作為參數,返回所對應的時間。
- 日期字符串的完整格式是“month day, year hours:minutes:seconds”,比如“December 25, 1995 13:30:00”。如果省略了小時、分鐘或秒數,這些值會被設為0。
#參數為日期字符串時,返回對應的時間:
# 如果省略了小時、分鐘或秒數,這些值會被設為0。
new Date('January 6, 2013');
// Sun Jan 06 2013 00:00:00 GMT+0800 (CST)
- 但是,其他格式的日期字符串,也可以被解析。事實上,所有可以被Date.parse()方法解析的日期字符串,都可以當作Date對象的參數。
new Date('2013-2-15')
new Date('2013/2/15')
new Date('02/15/2013')
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 Feb 2013')
new Date('15, Feberuary, 2013')
// Fri Feb 15 2013 00:00:00 GMT+0800 (CST)
- 總之,對于YYYY-MM-DD形式的字符串,JavaScript引擎可能會將其當作ISO格式來解析,采用格林尼治時區作為計時標準;而對于其他格式的日期字符串,一律視為非ISO格式,采用本地時區作為計時標準。(最好不要用這種方式,可以YYYY/MM/DD形式)
- 日期字符串有沒有前導0,返回的結果是不一樣的。如果沒有前導0,JavaScript引擎假設用戶處于本地時區,所以本例返回0點0分。如果有前導0(即如果你以ISO格式表示日期),就假設用戶處于格林尼治國際標準時的時區,所以返回8點0分。但是,ES6改變了這種做法,規定凡是沒有指定時區的日期字符串,一律認定用戶處于本地時區。
[2] new Date(year, month [, day, hours, minutes, seconds, ms]), 這種寫法 至少要兩個參數(年,月)
- Date對象還可以接受多個整數作為參數,依次表示年、月、日、小時、分鐘、秒和毫秒。
- 如果采用這種格式,最少需要提供兩個參數(年和月),其他參數都是可選的,默認等于0。因為如果只使用“年”這一個參數,Date對象會將其解釋為毫秒數。
year:四位年份,如果寫成兩位數,則加上1900
month:表示月份,0表示一月,11表示12月
---------月份從0開始算
date:表示日期,1到31
-----------------------------天數從1開始算
hour:表示小時,0到23
minute:表示分鐘,0到59
second:表示秒鐘,0到59
ms:表示毫秒,0到999
- 注意,月份從0開始計算,但是,天數從1開始計算。另外,除了日期默認為1,小時、分鐘、秒鐘和毫秒默認都是0。
let e81 = new Date(2018,0)
let e82 = new Date(2018,1)
let e865 = new Date(2018,5,5)
// e81 = Mon Jan 01 2018 00:00:00 GMT+0800 (中國標準時間)
// e82 = Thu Feb 01 2018 00:00:00 GMT+0800 (中國標準時間)
// e865 = Tue Jun 05 2018 00:00:00 GMT+0800 (中國標準時間)
(二) Date實例對象的方法
Date的實例對象,有幾十個自己的方法,分為以下三類。
- to類:從Date對象返回一個字符串,表示指定的時間。
- get類:獲取Date對象的日期和時間。
- set類:設置Date對象的日期和時間。
(1) to類:從Date對象返回一個字符串,表示指定的時間。
(1)Date.prototype.toString()
- toString方法返回一個完整的日期字符串。
var d = new Date(2013, 0, 1);
d.toString()
// "Tue Jan 01 2013 00:00:00 GMT+0800 (CST)"
d
// "Tue Jan 01 2013 00:00:00 GMT+0800 (CST)"
因為toString是默認的調用方法,所以如果直接讀取Date對象實例,就相當于調用這個方法。
(2)Date.prototype.toUTCString()
- toUTCString方法返回對應的UTC時間,也就是比北京時間晚8個小時。
var d = new Date(2013, 0, 1);
d.toUTCString()
// "Mon, 31 Dec 2012 16:00:00 GMT"
d.toString()
// "Tue Jan 01 2013 00:00:00 GMT+0800 (CST)"
(3)Date.prototype.toDateString()
- toDateString方法返回日期字符串。
var d = new Date(2013, 0, 1);
d.toDateString() // "Tue Jan 01 2013"
(4)Date.prototype.toTimeString()
- toTimeString方法返回時間字符串
var d = new Date(2013, 0, 1);
d.toTimeString() // "00:00:00 GMT+0800 (CST)"
(5)Date.prototype.toLocaleDateString()
- toLocaleDateString方法返回一個字符串,代表日期的當地寫法。
var d = new Date(2013, 0, 1);
d.toLocaleDateString()
// 中文版瀏覽器為"2013年1月1日"
// 英文版瀏覽器為"1/1/2013"
(6)Date.prototype.toLocaleTimeString()
- toLocaleTimeString方法返回一個字符串,代表時間的當地寫法。
var d = new Date(2013, 0, 1);
d.toLocaleTimeString()
// 中文版瀏覽器為"上午12:00:00"
// 英文版瀏覽器為"12:00:00 AM"
(2) get類:獲取Date對象的日期和時間。
Date對象提供了一系列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的時區差異,以分鐘表示,返回結果考慮到了夏令時因素。
所有這些get*方法返回的都是整數,不同方法返回值的范圍不一樣。
分鐘和秒:0 到 59
小時:0 到 23
星期:0(星期天)到 6(星期六)
日期:1 到 31
月份:0(一月)到 11(十二月)
年份:距離1900年的年數
var d = new Date('January 6, 2013');
d.getDate() // 6-----------------------------------------
d.getMonth() // 0----------------------------------------
d.getYear() // 113
d.getFullYear() // 2013----------------------------------
d.getTimezoneOffset() // -480
(3) set類:設置Date對象的日期和時間。
Date對象提供了一系列set*方法,用來設置實例對象的各個方面。
- set 這些方法基本是跟 get 方法一一對應的,但是沒有setDay方法,因為星期幾是計算出來的,而不是設置的。另外,需要注意的是,凡是涉及到設置月份,都是從0開始算的,即0是1月,11是12月。
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):設置毫秒時間戳。
Date對象
(二) Moment.js時間格式化插件
(1) 安裝
npm install moment --save
(2)引入和使用 - 在需要的地方引入
es5
var moment = require('moment');
moment().format();
es6
import moment from 'moment';
moment().format();
(3)示列:
//
2017-11-19T17:07:11+08:00 -------moment().format()
2016-06-06 -------moment().format('2016-06-06')
2016-6-6 -------moment().format('2016-6-6')
date.js:13-----------------------------------------------------
2017-11-19 -------moment().format('YYYY-MM-DD')
05/07/11 -------moment().format('hh/mm/ss')
date.js:16-----------------------------------------------------
17 "moment().hour()"
7 "moment().minute()"
11 "moment().second()"
date.js:20-----------------------------------------------------
2017 "moment().year()"
10 "moment().month()"
19 "moment().date()"
0 "moment().day()"
date.js:25-----------------------------------------------------
2018/11/19 -------moment().add(1,'y').format('YYYY/MM/DD')
2018 "moment().add(1,'years').year()-------這是number類型"
2018 -------moment().add(1,'years').format('YYYY')-------這是string類型
2016 "moment().subtract(1,'y').year()"
11 -------moment().startOf('month').format('MM')
(三) ps: 形參和實參
(1)形參,是在定義函數時使用的參數,目的是用來接收調用該函數時傳進來的實際參數。
(2)實參:是在調用時傳遞給函數的參數
function myfun(a,b,c){
...
}
myfun(1,2,3);
這里a,b,c就是形參。1,2,3為實參。
形參和實參是不同的變量,他們在內存中處于不同的位置,形參在函數運行結束時將被釋放。
(四) 參數傳遞:傳值傳遞和傳址傳遞
(1)傳值傳遞
- 函數參數(實參)如果是原始類型的值(數值、字符串、布爾值),
- 那么傳遞方式是就是傳值傳遞(passes by value)。
- 這意味著,在函數體內修改參數值,不會影響到函數外部。
(傳值傳遞,在函數內部,參數值是原始值的拷貝,無論怎么修改,都不會影響到原始值。)
var p = 2; // 數字作為參數 屬于 原始類型的值
function f(p) { // 形參
p = 3; // 函數聲明和初始化
}
f(p); // 實參,傳值傳遞-----------------------參數是數字,字符串,布爾值
// 調用f()函數,沒有返回值
p // 2 // 傳值傳遞,在函數體內修改參數值,不會影響到函數外部
上面代碼中,變量p是一個原始類型的值,傳入函數f的方式是傳值傳遞。
因此,在函數內部,p的值是原始值的拷貝,無論怎么修改,都不會影響到原始值。
(2) 傳址傳遞
- 如果函數參數是復合類型的值(數組、對象、其他函數),
- 傳遞方式是傳址傳遞(pass by reference)。
- 也就是說,傳入函數的原始值的地址,因此在函數內部修改參數,將會影響到原始值。
var obj = {p: 1}; // 對象作為參數 屬于 符合類型的值
function f(o) { // 形參
o.p = 2;
}
f(obj); // 實參,傳址傳遞-----------------------參數是對象,數組,其他函數
obj.p // 2 // 傳址傳遞,在函數內部修改參數值,會影響到函數外部的原始值
上面代碼中,傳入函數f的是參數對象obj的地址。因此,在函數內部修改obj的屬性p,會影響到原始值。
(3) 注意:
如果函數內部修改的,不是參數對象的某個屬性,而是替換掉整個參數,這時不會影響到原始值。
var obj = [1, 2, 3];
function f(o){
o = [2, 3, 4];
}
f(obj);
obj // [1, 2, 3]
上面代碼中,在函數f內部,參數對象obj被整個替換成另一個值。這時不會影響到原始值。
這是因為,形式參數(o)與實際參數obj存在一個賦值關系。
(4) 某些情況下,如果需要對某個原始類型的變量,獲取傳址傳遞的效果,可以將它寫成全局對象的屬性。
var a = 1;
function f(p) {
window[p] = 2;
}
f('a');
a // 2
上面代碼中,變量a本來是傳值傳遞,但是寫成window對象的屬性,就達到了傳址傳遞的效果
傳值傳遞,傳址傳遞例子:
export default class DatesTest extends Component {
aaa = 1;
bbb = 'abc';
ccc = false;
eee = [1,2,3];
fff = {'a':1,'b':2};
funTest = (a,b,c,e,f,g) => {
a = 22222222222222;
b = 'abccccccccccc';
c = true;
e[0] = 1111111111111111;
f['a'] = 22222222222222
}
componentDidMount() {
this.funTest(this.aaa,this.bbb,this.ccc,this.eee,this.fff)
console.log(this.aaa,'this.aaa');
console.log(this.bbb,'this.bbb');
console.log(this.ccc,'this.ccc');
console.log(this.eee,'this.eee');
console.log(this.fff,'this.fff');
}
}
// 執行結果:
1 "this.aaa"
abc this.bbb
false "this.ccc"
[1111111111111111, 2, 3] "this.eee"
Object {a: 22222222222222, b: 2} "this.fff"