[JavaScript] Date& Timer
前言
定時器和倒數計時器所用到: Date()
、 setTimeout()
和setInterval()
這幾個方法來完成,算是蠻常用到的。
Date()
Date()
是JavaScript 原生的時間方法,它以國際標準時間(UTC)1970年1月1日00:00:00作為時間起點,單位為毫秒。
取得當前時間的方法:
可以作為一般函數直接呼叫,回傳當前時間
1 |
|
即使帶有參數,Date作為普通函數使用時,返回的還是當前時間
1 |
|
new 方法
透過new 方法賦值給一變數,透過變數取得當前時間, 返回的是字串。
1 |
|
Date()
方法可接受多種格式參數,回傳一個該參數對應的時間
1 |
|
Date方法使用函數的參數,有幾點要注意:
只要是能被Date.parse()解析的字串,都可以當作參數
以下返回的都是同一個時間。
1 |
|
參數為年、月、日等多個整數時,年和月是不能省略的,其他參數都可以省略的。也就是說,至少需要兩個參數,因為如果只使用“年”這一個參數,Date會將誤為毫秒數。
下面程式碼中,2013被解釋為毫秒數,而不是年份
1 |
|
下面範例返回的都是2013年1月1日零點
1 |
|
重要的參數取值範圍,需特別注意月份計算的起始點是0
年:使用四位數年份,比如2000。如果寫成兩位數或個位數,則加上1900,即10代表1910年。如果是負數,表示公元前。
月:0表示一月,依次類推,11表示12月。
日:1到31。
小時:0到23。
分鐘:0到59。
秒:0到59
毫秒:0到999
參數如果超出了正常範圍,會被自動換算
1 |
|
get()
除上述方法,還可以透過一系列get方法,獲取特定時間, 且返回的都是*整數:
getTime()
:返回當前時間距離1970年1月1日00:00:00的毫秒數getDate()
:返回當前時間對應每個月的幾號(從1開始)。getDay()
:返回星期幾,星期日為0,星期一為1,以此類推。getFullYear()
:返回四位的年份。getMonth()
:返回月份(0表示1月,11表示12月)。getHours()
:返回小時(0-23)。getMilliseconds()
:返回毫秒(0-999)。getMinutes()
:返回分鐘(0-59)。getSeconds()
:返回秒(0-59)。
範例:
1 |
|
時間設置的方法
set()
一系列set*方法,用來設置當前時間。
setDate(date)
:設置當前時間對應的每個月的幾號(1-31),返回改變後時間(毫秒)。setFullYear(year)
:設置四位年份。setHours(hour)
:設置小時(0-23)。setMilliseconds()
:設置毫秒(0-999)。setMinutes(min)
:設置分鐘(0-59)。setMonth(month)
:設置月份(0-11)。setSeconds(sec)
:設置秒(0-59)。setTime(milliseconds)
:設置毫秒時間。
Timer
JavaScript提供定時的方法,可以設置定時器。
setTimeout()
setTimeout()
用來指定某個函數或某段code在多少毫秒之後執行。var timer = setTimeout(function|code, delay);
setTimeout()
函數接受兩個參數,第一個參數function|code是將要延遲執行的函數名稱或一段code,第二個參數delay是延遲執行的毫秒數。 第二個參數如果省略,則默認為0。
1 |
|
clearTimeout()
取消setTimeout()
設的定時器。
setInterval()
setInterval()
函數的用法與setTimeout()完全一致,差別在於setInterval()
可以無限次的設置定時器執行。
1 |
|
clearInterval()
取消setInterval()
設的定時器。
setInterval()
可以無限次的設置定時器,所以setInterval()
有重複設置的問題。
1 |
|
上述的code會遇到點擊兩次start
鈕時,index+1
的時間會加快,點stop鈕無法停止的狀況。
解決辦法是設置if條件判斷:
1 |
|
將停止時鐘的函數在後面添加timer=null
,表時鐘狀態為關閉,並且在點擊事件函數內的時鐘設置,多添加if
條件判斷,確定時鐘狀態為null
才能開啟時鐘,解決重複設置的問題。
實作一個倒數計時器
1 |
|
透過取得當前時間,以及設置結束時間兩者之間的差距,配合setInterval()
來完成。
參考來源1
參考來源2