## Date類型
在JavaScript中,Date類型是用來保存日期的,它能精確到1970年1月1日之前或之后的285616年。
**1、創建日期對象**
要創建一個日期對象,使用new操作符和Date構造函數即可:
```
var now = new Date();
```
在調用Date構造函數而不傳遞參數時,新創建的對象自動獲得當前日期和時間。
如果要根據特定的日期和時間創建日期對象,必須傳入表示該日期的毫秒數(即從UTC時間1970年1月1日起至該日期止經過的毫秒數)
注意:如果給Date構造函數傳入的是其他格式,也會在后臺調用Date.parse(),將其轉換成毫秒數。
**1.1 Date.parse()**
Date.parse()接收一個表示日期的字符串參數,然后嘗試根據這個字符串返回相應日期的毫秒數。
將地區設置為美國的瀏覽器,通常可以接受下列日期格式:
- “月/日/年”,如11/11/2016
- “英文月名 日,年”,如 January 12,2016
- “英文星期幾 英文月名 日 年 時:分:秒 時區”,如Tue May 25 2016 00:00:00 GMT-0700
- ISO 8601擴展格式 YYYY-MM-DDTHH:mm:ss:sssZ,如2016-11-11T00:00:00。兼容ECMAScript 5的瀏覽器支持這種格式。
```
var someDate = new Date(Date.parse('2016-11-11'));
//Fri Nov 11 2016 08:00:00 GMT+0800 (中國標準時間)
```
如果傳入Date.parse()方法的字符串不能表示日期,則會返回NaN。
前面說過:如果給Date構造函數傳入的是其他格式,也會在后臺調用Date.parse(),將其轉換成毫秒數,所以我們也可以這樣設置:
```
var someDate = new Date('2016-11-11');
//Fri Nov 11 2016 08:00:00 GMT+0800 (中國標準時間)
```
**1.2 Date.UTC()**
Date.UTC()同樣能返回表示日期的毫秒數。不過,它傳入的參數有所不同,分別是年份、基于0的月份(一月是0,二月是1,以此類推)、月中的哪一天(1到31)、小時數(0到23)、分鐘、秒數以及毫秒數,只有前兩個參數是必須的。如果沒有提供月中的天數,則假設天數為1。如省略其他參數,默認為0.
```
var y2k = new Date(Date.UTC(2016,0));
//Fri Jan 01 2016 08:00:00 GMT+0800 (中國標準時間)
var someDate = new Date(Date.UTC(2016, 0, 1, 0, 0, 0));
//Fri Jan 01 2016 08:00:00 GMT+0800 (中國標準時間)
```
上面的y2k和someDate是等價的。
如同模仿Date.parse()一樣,Date構造函數也會模仿Date.UTC(),它會基于本地時區來創建。
```
var y2k = new Date(2016, 0)
var someDate = new Date(2016, 0, 1, 0, 0, 0);
```
上面兩個是等價的。
**1.3 Date.now()**
Date.now()返回表示調用這個方法時的日期和時間的毫秒數。
```
var times = Date.now();
//1479438986198
```
我們也可以使用+操作符實現Date.now()的功能:
```
var times2 = +new Date();
//1479438986198
```
**2、Date實例對象的方法**
**2.1 繼承的方法**
**(1)toLocaleString()**
Date類型的toLocaleString()方法會按照與瀏覽器設置的時區相適應的格式返回日期和時間,包含AM或PM,但不包含時區。
```
var dateString = new Date();
console.log(dateString.toLocaleString());
// 2016/11/18 下午12:19:47
```
**(2)toString()**
Date類型的toString()返回帶有時區信息的日期和時間,其中時間一般以軍用時間(即小時的范圍是0到23)
```
var dateString = new Date();
console.log(dateString.toString());
// Fri Nov 18 2016 12:19:47 GMT+0800 (中國標準時間)
```
**(3)valueOf()**
Date類型的valueOf()返回日期的毫秒數,也就是返回Date實例本身。
```
var dateString = new Date();
console.log(dateString.valueOf());
// 1479442787239
```
**2.2 日期格式化方法**
Date類型提供了一些將日期格式化為字符串的方法,如下:
**(1)toDateString()**
toDateString()方法返回格式為星期幾、月、日和年的字符串。
```
var dateString = new Date();
console.log(dateString.toDateString());
// Fri Nov 18 2016
```
**(2)toTimeString()**
toTimeString()返回格式為時、分、秒和時區的字符串
```
var dateString = new Date();
console.log(dateString.toTimeString());
// 12:30:35 GMT+0800 (中國標準時間)
```
**(3)toLocaleDateString()**
toLocaleDateString()返回格式為星期幾、月、日和年的字符串(依照時區的不同,顯示的格式也會所有不同)
```
var dateString = new Date();
console.log(dateString.toLocaleDateString());
// 2016/11/18
```
**(4)toLocaleTimeString()**
toLocaleTimeString() 返回格式為時、分、秒的字符串
```
var dateString = new Date();
console.log(dateString.toLocaleTimeString());
// 下午12:30:35
```
**(5)toUTCString()**
toUTCString()返回完整的UTC日期
```
var dateString = new Date();
console.log(dateString.toUTCString());
// Fri, 18 Nov 2016 04:30:35 GMT
```
**2.2 日期/時間組件方法**
日期/時間組件方法可分為兩類:
- get類方法:獲取Date對象的日期和時間
- set類方法:設置Date對象的日期和時間
**2.2.1 get類方法**
Date對象提供了一些獲取日期和時間的方法:
```
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的時區差異,以分鐘表示,返回結果考慮到了夏令時因素。
```
上面這些方法返回的都是正數,不同值返回的范圍不一樣:
```
分鐘和秒:0 到 59
小時:0 到 23
星期:0(星期天)到 6(星期六)
日期:1 到 31
月份:0(一月)到 11(十二月)
年份:距離1900年的年數
```
上面這些get類方法返回的都是當前時區的時間,Date對象還提供了這些方法對應的UTC版本,用來返回UTC時間。
```
getUTCDate()
getUTCFullYear()
getUTCMonth()
getUTCDay()
getUTCHours()
getUTCMinutes()
getUTCSeconds()
getUTCMilliseconds()
```
**2.2.2 set類方法**
Date對象提供了一些設置日期和時間的方法:
```
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):設置毫秒時間戳。
```
注意:月份都是從0開始的。
set類方法的參數都會自動折算。下面以setDate為例,如果參數超過當月的最大天數,則向下一個月順延,如果參數是負數,表示從上個月的最后一天開始減去的天數。
**(1)setDate()**
這里重點講一些setDate()方法,平常用的比較多。
setDate()傳入特殊值時:
- 當傳入0時,表示為上一個月的最后一天;
- 當傳入負數時,表示上一個月最后一天之前的第幾天(比如-1表示上一個月最后一天之前的一天)
- 當傳入32時,如果當月有31天,32表示下個月的第一天;如果當月有30天,32表示為下一個月的第二天
傳入32獲取當月天數
```
var now = new Date();
console.log(now);
now.setDate(32);
console.log(now);
var aMontthDay = 32 - now.getDate();
console.log(aMonthDay);
// Fri Nov 18 2016 13:13:03 GMT+0800 (中國標準時間)
// Fri Dec 02 2016 13:13:03 GMT+0800 (中國標準時間)
// 30
```
set類方法也有對應的設置UTC時間的方法:
```
setUTCDate()
setUTCFullYear()
setUTCHours()
setUTCMilliseconds()
setUTCMinutes()
setUTCMonth()
setUTCSeconds()
```
- 前言
- JavaScript簡介
- 基本概念
- 語法
- 數據類型
- 運算符
- 表達式
- 語句
- 對象
- 數組
- 函數
- 引用類型(對象)
- Object對象
- Array對象
- Date對象
- RegExp對象
- 基本包裝類型(Boolean、Number、String)
- 單體內置對象(Global、Math)
- console對象
- DOM
- DOM-屬性和CSS
- BOM
- Event 事件
- 正則表達式
- JSON
- AJAX
- 表單和富文本編輯器
- 表單
- 富文本編輯器
- canvas
- 離線應用
- 客戶端存儲(Cookie、Storage、IndexedDB)
- HTML5 API
- Video/Audio
- Geolocation API
- requestAnimationFrame
- File API
- FullScreen API
- IndexedDB
- 檢測設備方向
- Blob
- vibrate
- Luminosity API
- WebRTC
- Page Visibility API
- Performance API
- Web Speech
- Notification
- 面向對象的程序設計
- 概述
- this關鍵字
- 原型鏈
- 作用域
- 常用API合集
- SVG
- 錯誤處理機制
- JavaScript開發技巧合集
- 編程風格
- 垃圾回收機制