javascript類型系統——日期Date對象

来源:http://www.cnblogs.com/xiaohuochai/archive/2016/07/12/5663102.html
-Advertisement-
Play Games

× 目錄 [1]靜態方法 [2]構造函數 [3]實例方法 前面的話 Date對象是javascript語言中內置的數據類型,用於提供日期和時間的操作介面。Date對象是在早期java中的java.util.Date類基礎上創建的,為此,Date類型使用自UTC1970年1月1日0點開始經過的毫秒數來 ...


×
目錄
[1]靜態方法 [2]構造函數 [3]實例方法

前面的話

  Date對象是javascript語言中內置的數據類型,用於提供日期和時間的操作介面。Date對象是在早期java中的java.util.Date類基礎上創建的,為此,Date類型使用自UTC1970年1月1日0點開始經過的毫秒數來保存日期,它可以表示的時間範圍是1970年1月1日0點前後的各1億天。本文將詳細介紹Date對象的用法

 

靜態方法

  在介紹Date對象的構造函數之前,先介紹靜態方法。因為,Date對象的靜態方法與其構造函數有著千絲萬縷的聯繫。使用構造函數創建Date對象的過程,類似於披著外套的靜態方法的使用過程

  Date對象總共有三個靜態方法,分別是Date.now()、Date.parse()、Date.UTC()。這些方法通過Date()構造函數本身調用,而不是通過Date實例對象

Date.now()

  ECMAScript5新增了now()方法,該方法返回當前時間距離1970年1月1日0點UTC的毫秒數。該方法不支持傳遞參數

  [註意]該方法返回的是Number數字類型

console.log(Date.now());//1468297046050
console.log(Date.now('2016,1,1'));//1468297046050
console.log(typeof Date.now());//'number'

  在不支持Date.now()方法的瀏覽器中,可以用+操作符把Date對象轉換成數字,也可以實現類似效果

console.log(new Date());//Tue Jul 12 2016 12:21:33 GMT+0800 (中國標準時間)
console.log(+new Date());//1468297293433
console.log(+new Date(2000,1,1));//949334400000

  該方法常用於分析代碼的工作

var start = Date.now();
doSomething();
var stop = Date.now();
result = stop - start;

Date.parse()

  該方法用於解析一個日期字元串,參數是一個包含待解析的日期和時間的字元串,返回從1970年1月1日0點到給定日期的毫秒數

  該方法會根據日期時間字元串格式規則來解析字元串的格式,除了標準格式外,以下格式也支持。如果字元串無法識別,將返回NaN

  1、'月/日/年' 如6/13/2004

  2、'月 日,年' 如January 12,2004或Jan 12,2004

  3、'星期 月 日 年 時:分:秒 時區' Tue May 25 2004 00:00:00 GMT-0700

  [註意]瀏覽器不支持不表示日期只表示時間的字元串格式

console.log(Date.parse('6/13/2004'));//1087056000000
console.log(Date.parse('January 12,2004'));//1073836800000
console.log(Date.parse('Tue May 25 2004 00:00:00 GMT-0700'));//1085468400000
console.log(Date.parse('2004-05-25T00:00:00'));//1085443200000
console.log(Date.parse('2016'));//1451606400000
console.log(Date.parse('T00:00:00'));//NaN
console.log(Date.parse());//NaN

  [註意]在ECMAScript5中,如果使用標準的日期時間字元串格式規則的字元串中,數學前有前置0,則會解析為UTC時間,時間沒有前置0,則會解析為本地時間。其他情況一般都會解析為本地時間

console.log(Date.parse('7/12/2016'));//1468252800000
console.log(Date.parse('2016-7-12'));//1468252800000
console.log(Date.parse('2016-07-12'));//1468281600000

Date.UTC()

  Date.UTC()同樣返回給定日期的毫秒數,但其參數並不是一個字元串,而是分別代表年、月、日、時、分、秒、毫秒的數字參數

  Date.UTC(year,month,day,hours,minutes,seconds,ms),year和month參數是固定的,其餘參數可選,日期時間格式規則詳見此

  因為該函數有7個形參,所以其length值為7

console.log(Date.UTC.length);//7

  [註意]該方法使用的是UTC時間,而不是本地時間

console.log(Date.UTC(1970));//NaN
console.log(Date.UTC(1970,0));//0
console.log(Date.UTC(1970,0,2));//86400000
console.log(Date.UTC(1970,0,1,1));//3600000
console.log(Date.UTC(1970,0,1,1,59));//714000
console.log(Date.UTC(1970,0,1,1,59,30));//717000

 

構造函數

  Date()構造函數有多達5種的使用方法

  【0】Date()函數可以不帶new操作符,像一個函數一樣調用。它將忽略所有傳入的參數,並返回當前日期和時間的一個字元串表示

    Date();

  [註意]由於Date()函數沒有使用操作符,實際上它不能被稱為構造函數

console.log(Date());//"Tue Jul 12 2016 13:38:41 GMT+0800 (中國標準時間)"
console.log(Date('2016/1/1'));//"Tue Jul 12 2016 13:38:41 GMT+0800 (中國標準時間)"
console.log(typeof Date());//'string'

  【1】Date()函數使用new操作符,且不帶參數時,將根據當前時間和日期創建一個Date對象

    new Date();
console.log(new Date());//Tue Jul 12 2016 13:41:45 GMT+0800 (中國標準時間)
console.log(new Date);//Tue Jul 12 2016 13:41:45 GMT+0800 (中國標準時間)
console.log(typeof new Date());//'object'

  【2】Date()函數可接受一個數字參數,該參數表示設定時間與1970年1月1日0點之間的毫秒數

new Date(milliseconds);
console.log(new Date(0));//Thu Jan 01 1970 08:00:00 GMT+0800 (中國標準時間)
console.log(new Date(86400000));//Fri Jan 02 1970 08:00:00 GMT+0800 (中國標準時間)
console.log(typeof new Date(0));//object

  【3】Date()函數可接受一個字元串參數,參數形式類似於Date.parse()方法。但parse()方法返回的是一個數字,而Date()函數返回的是一個對象 

new Date(datestring);
console.log(new Date('6/13/2004'));//Sun Jun 13 2004 00:00:00 GMT+0800 (中國標準時間)
console.log(Date.parse('6/13/2004'));//1087056000000
console.log(typeof new Date(6/13/2004));//object
console.log(typeof Date.parse(6/13/2004));//number

  關於標準的日期時間字元串中前置0的處理,也類似於Date.parse()方法,若有前置0,則相當於UTC時間,若沒有,則相當於本地時間。其餘情況一般都為本地時間

console.log(new Date('7/12/2016'));//Tue Jul 12 2016 00:00:00 GMT+0800 (中國標準時間)
console.log(new Date('2016-7-12'));//Tue Jul 12 2016 00:00:00 GMT+0800 (中國標準時間)
console.log(new Date('2016-07-12'));//Tue Jul 12 2016 08:00:00 GMT+0800 (中國標準時間)

  【4】Date()函數可接受參數形式類似於Date.UTC()方法的參數,但Date.UTC()方法返回是一個毫秒數,且是UTC時間,而Date()函數返回是一個對象,且是本地時間

console.log(new Date(2016,7,12));//Fri Aug 12 2016 00:00:00 GMT+0800 (中國標準時間)
console.log(+new Date(2016,7,12));//1470931200000
console.log(typeof new Date(2016,7,12));//'object'
console.log(Date.UTC(2016,7,12));//1470960000000
console.log(typeof Date.UTC(2016,7,12));//'number'

  [註意]使用參數類似於Date.parse()函數的方法時,如果日期對象超出範圍,瀏覽器會自動將日期計算成範圍內的值;使用參數類似於Date.UTC()函數的方法時,如果日期對象超出範圍,瀏覽器會提示Invalid Date

console.log(new Date(2016,7,32));//Thu Sep 01 2016 00:00:00 GMT+0800 (中國標準時間)
console.log(new Date(2016,8,1));//Thu Sep 01 2016 00:00:00 GMT+0800 (中國標準時間)
console.log(new Date('2016-8-32'));//Invalid Date
console.log(new Date('2016-9-1'));//Thu Sep 01 2016 00:00:00 GMT+0800 (中國標準時間)

 

實例方法

  Date對象沒有可以直接讀寫的屬性,所有對日期和時間的訪問都需要通過方法。Date對象的大多數方法分為兩種形式:一種是使用本地時間,一種是使用UTC時間,這些方法在下麵一起列出。例如,get[UTC]Day()同時代表getDay()和getUTCDay()

  Date對象一共有46個實例方法,可以分為以下3類:to類、get類、set類

【to類】

  to類方法從Date對象返回一個字元串,表示指定的時間

toString()

  返回本地時區的日期字元串

toUTCString()

  返回UTC時間的日期字元串

toISOString()

  返回Date對象的標準的日期時間字元串格式的字元串

toTimeString()

  返回Date對象的時間部分的字元串

toJSON()

  返回一個符合JSON格式的日期字元串,與toISOString方法的返回結果完全相同

console.log(new Date('2016-7-12').toString());//Tue Jul 12 2016 00:00:00 GMT+0800 (中國標準時間)
console.log(new Date('2016-7-12').toUTCString());//Mon, 11 Jul 2016 16:00:00 GMT
console.log(new Date('2016-7-12').toISOString());//2016-07-11T16:00:00.000Z
console.log(new Date('2016-7-12').toDateString());//Tue Jul 12 2016
console.log(new Date('2016-7-12').toTimeString());//00:00:00 GMT+0800 (中國標準時間)
console.log(new Date('2016-7-12').toJSON());//2016-07-11T16:00:00.000Z

toLocaleString()

  toString()方法的本地化轉換

toLocaleTimeString()

  toTimeString()方法的本地化轉換

toLocaleDateString()

  toDateString()方法的本地化轉換

console.log(new Date('2016-7-12').toString());//Tue Jul 12 2016 00:00:00 GMT+0800 (中國標準時間)
console.log(new Date('2016-7-12').toLocaleString());//2016/7/12 上午12:00:00
console.log(new Date('2016-7-12').toDateString());//Tue Jul 12 2016
console.log(new Date('2016-7-12').toLocaleDateString());//2016/7/12
console.log(new Date('2016-7-12').toTimeString());//00:00:00 GMT+0800 (中國標準時間)
console.log(new Date('2016-7-12').toLocaleTimeString());//上午12:00:00

【get類】

  Date對象提供了一系列get類方法,用來獲取實例對象某個方面的值

  在介紹get類方法之前,首先要介紹valueOf()方法

valueOf()

  返回距離1970年1月1日0點的毫秒數

  因此,可以方便地使用比較運算符來比較日期值

var date1 = new Date(2007,0,1);
var date2 = new Date(2007,1,1);
console.log(date1 > date2);//false
console.log(date1 < date2);//true

getTime()

  返回距離1970年1月1日0點的毫秒數,同valueOf()

  在ECMAScript5之前,可以使用getTime()方法實現Date.now()

    Date.now = function(){
        return (new Date()).getTime()
    }

getTimezoneOffset()

  返回當前時間與UTC的時區差異,以分鐘錶示(8*60=480分鐘),返回結果考慮到了夏令時因素

console.log(new Date('2016-7-12').valueOf());//1468252800000
console.log(new Date('2016-7-12').getTime());//1468252800000
console.log(new Date('2016-7-12').getTimezoneOffset());//-480

getYear()

  返回距離1900年的年數(已過時)

get[UTC]FullYear()

  返回年份(4位數)

get[UTC]Month()

  返回月份(0-11)

get[UTC]Date()

  返回第幾天(1-31)

get[UTC]Day()

  返回星期幾(0-6)

get[UTC]Hours()

  返回小時值(0-23)

get[UTC]Minutes()

  返回分鐘值(0-59)

get[UTC]Seconds()

  返回秒值(0-59)

get[UTC]Milliseconds()

  返回毫秒值(0-999)

  [註意]通過標準日期時間格式字元串,且有前置0的形式的參數設置,設置的是UTC時間

console.log(new Date('2016-07-12T10:00').getYear());//116
console.log(new Date('2016-07-12T10:00').getFullYear());//2016
console.log(new Date('2016-07-12T10:00').getUTCFullYear());//2016
console.log(new Date('2016-07-12T10:00').getMonth());//6
console.log(new Date('2016-07-12T10:00').getUTCMonth());//6
console.log(new Date('2016-07-12T10:00').getDate());//12
console.log(new Date('2016-07-12T10:00').getUTCDate());//12
console.log(new Date('2016-07-12T10:00').getDay());//2
console.log(new Date('2016-07-12T10:00').getUTCDay());//2
console.log(new Date('2016-07-12T10:00').getHours());//18
console.log(new Date('2016-07-12T10:00').getUTCHours());//10
console.log(new Date('2016-07-12T10:00').getMinutes());//0
console.log(new Date('2016-07-12T10:00').getUTCMinutes());//0
console.log(new Date('2016-07-12T10:00').getSeconds());//0
console.log(new Date('2016-07-12T10:00').getUTCSeconds());//0
console.log(new Date('2016-07-12T10:00').getMilliseconds());//0
console.log(new Date('2016-07-12T10:00').getUTCMilliseconds());//0
//當前時間為16:35
console.log(new Date().getHours());//16
console.log(new Date().getUTCHours());//8

【set類】

  Date對象提供了一系列set類方法,用來設置實例對象的各個方面

  set方法基本與get方法相對應,set方法傳入類似於Date.UTC()的參數,返回調整後的日期的內部毫秒數

  [註意]星期只能獲取,不能設置

setTime()

  使用毫秒的格式,設置一個Date對象的值

var d = new Date('2016-07-12T10:00');
console.log(d.setTime(86400000),d);//86400000 Fri Jan 02 1970 08:00:00 GMT+0800 (中國標準時間)

setYear()

  設置年份(已過時)

var d = new Date('2016-07-12T10:00');
console.log(d.setYear(2000),d,d.getYear());//963396000000 Wed Jul 12 2000 18:00:00 GMT+0800 (中國標準時間) 100

set[UTC]FullYear()

  設置年份(4位數),以及可選的月份值和日期值

set[UTC]Month()

  設置月份(0-11),以及可選的日期值

set[UTC]Date()

  設置第幾天(1-31)

var d = new Date('2016-07-12T10:00');
console.log(d.setFullYear(2015,1,1),d.getFullYear());//1422784800000 2015
console.log(d.setMonth(2),d.getMonth());//1425204000000 2
console.log(d.setDate(20),d.getDate());//1426845600000 20
console.log(d.toLocaleString());//2015/3/20 下午6:00:00

set[UTC]Hours()

  設置小時值(0-23),以及可選的分鐘值、秒值及毫秒值

set[UTC]Minutes()

  設置分鐘值(0-59),以及可選的秒值及毫秒值

set[UTC]Seconds()

  設置秒值(0-59),以及可選的毫秒值

set[UTC]Milliseconds()

  設置毫秒值(0-999)

var d = new Date('2016-07-12T10:20:30');
console.log(d.setHours(1,2,3),d.getHours());//1468256523000 1
console.log(d.setMinutes(2,3),d.getMinutes());//1468256523000 2
console.log(d.setSeconds(3),d.getSeconds());//1468256523000 3
console.log(d.toLocaleTimeString())//上午1:02:03
var d = new Date('2016-07-12T10:20:30');
console.log(d.setUTCHours(1,2,3),d.getHours());//1468285323000  9
console.log(d.setUTCMinutes(2,3),d.getMinutes());//1468285323000  2
console.log(d.setUTCSeconds(3),d.getSeconds());//1468285323000  3
console.log(d.toLocaleTimeString())//上午9:02:03

 

參考資料

【1】 ES5/Date對象 https://www.w3.org/html/ig/zh/wiki/ES5/builtins#Date_.E5.AF.B9.E8.B1.A1
【2】 阮一峰Javascript標準參考教程——標準庫——Date對象 http://javascript.ruanyifeng.com/stdlib/date.html
【3】 W3School-Javascript高級教程——Date對象 http://www.w3school.com.cn/jsref/jsref_obj_date.asp
【4】《javascript權威指南(第6版)》第三部分 javascript核心參考
【5】《javascript高級程式設計(第3版)》第5章 引用類型


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JNA 調用 dll 庫時,保錯: 我環境是 64 位 win7. java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 應用程式。 解決方法, 刪掉了系統中的 64 位的 JDK,就沒有再報該錯誤了。 ...
  • Java.util.zip 提供用於讀寫標準 ZIP 和 GZIP 文件格式的類。 還包括使用 DEFLATE 壓縮演算法(用於 ZIP 和 GZIP 文件格式)對數據進行壓縮和解壓縮的類。 依賴 Jdk 編寫該工具類,不依賴任何第三方 jar,隨用隨取,實現功能大體如下: 1.目錄級別遞歸壓縮與解壓 ...
  • c++ auto_ptr智能指針 該類型在頭文件memory中,在程式的開通通過 #include<memory> 導入,接下來講解該智能指針的作用和使用。 使用方法: auto_ptr<type> ptr(new type()); 這是該指針的定義形式,其中 type 是指針指向的類型,ptr 是 ...
  • 前文Selenium2入門(一)說到Selenium是Web 應用程式測試框架,那麼如果對一個簡單的web應用需求:打開瀏覽器,登錄百度首頁,輸入“歐洲杯”關鍵詞,點擊搜索按鈕 這一系列操作,能否用Selenium進行執行呢?可以,下麵介紹的WebDriver就是可以完成這項任務的方法之一: Web ...
  • 目錄: 1.StringBuffer和StringBuilder有什麼區別?假設有一個方法,方法內部需要定義一個對象,可能是StringBuffer或StringBuilder,接下來會多次append操作,方法結束時,返回這個對象的toString()結果,並且這個線程會被多線程併發訪問,請選擇這 ...
  • 回到目錄 關於依賴倒置(DIP) 高層模塊不依賴於低層模塊的實現,而低層模塊依賴於高層模塊定義的介面,通俗的講,就是高層模塊定義介面,低層模塊負責實現,這在我們實際開發中經常被用到,層與層之間引用,經常被添加一個介面層去隔離,在介面層定義相關業務規範,而底層去實現它,高層只引用這個介面,當高級需要其 ...
  • 回到目錄 對於一個後臺管理系統來說,你的許可權設計與安全是重中之重,當你為一個許可權分配一些菜單後,當這個許可權的用戶沒有菜單許可權時,這個菜單的URL是不可以被用戶訪問的,而在之前的設計中,沒有考慮到這點,所以本次Lind.DDD.Manager的升級中,需要把這塊完善一下,將會在8月的Lind.DDD中 ...
  • 上一篇《[讓 Generator 自啟動][generator]》介紹了通過起動器讓 Generator 跑起來,而本篇採用 async 實現更優雅的非同步編程。 <! more 從例子開始 借用上一篇例子中的例子說起。 然後,我們需要寫一個啟動器來啟動這個函數。 而採用 async 寫,代碼則是: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...