摘要:實際上,構造函數接收的參數是一個從年月日凌晨點到希望設定的時間點的毫秒數可以為負,表示在此之前。當前時間構造函數的另一個非常常用的用法是,不傳遞參數,這時候,新創建的對象將自動獲得當前日期和時間。
Date是javascript中的引用數據類型之一,如果要處理日期、時間,一般都會用到Date類型。不過,要正確地使用Date,還應該了解日期和時間有關的概念。就從Date類型的方法開始吧。
創建Date下面這段代碼用了不同的形式,創建了一個名為teaTime的變量,并賦值為Date類型值,時間是最近的某一個時間點:
// one way var teaTime = new Date("Aug 21 2014 16:40:14"); // equivalent to... var teaTime = new Date(2014, 7, 21, 16, 40, 14);
其中,構造函數Date傳入了兩種參數,來賦值給teaTime。不過,它們的效果是相同的,都代表同一個時間點。實際上,構造函數Date接收的參數是一個從1970年1月1日凌晨0點到希望設定的時間點的毫秒數(可以為負,表示在此之前)。上面的例子為什么可行呢?這是因為對于第一種字符串形式的單個參數,會在后臺先調用Date.parse()方法轉化為毫秒數。類似的,第二種數字形式的多個參數(你可能還發現了月份是以數字0~11來表示的),會在后臺調用Date.UTC()方法轉化為毫秒數。
UTC?這是什么?
UTCUTC是指協調世界時,是最主要的世界時間標準。這個縮寫也是有來源的,英語中它是CUT(Cooordinated Universal Time),而法語中它是TUC(Temps Universel Coordonné),由于被希望協調世界時在所有語言中有統一的縮寫,最后妥協使用了這個[UTC][](竟然妥協了!)。
UTC是以[原子時][]秒長為基礎的。也許你還有印象,在國際單位制(SI)中,只有7個基本單位,秒(s)就是其中之一,用的就是原子時。因此,UTC足夠精確,被作為現今使用的標準時間。
與UTC非常有關的是另一個經常被提及的時間標準,GMT。
GMTGMT是指格林尼治標準時間,它對應位于英國倫敦郊區的皇家格林威治天文臺的標準時間。[GMT][](Greenwich Mean Time)受地球自轉影響,可能有較大誤差,因此GMT已經不再被作為標準時間使用(也就是說,現在用UTC作為標準)。不過,如果不考慮小于0.9秒的差異,GMT和UTC的時間可以認為是一樣的。
Date.parse()可用的字符串格式從前文可以知道,由于并不方便直接傳入一個相對于1970年1月1日凌晨0點的毫秒數,通常我們都用Date.parse()和Date.UTC()所支持的參數形式。其中,Date.parse()是接收表示日期的字符串參數,如果格式不對,將返回NaN。
Date.parse()可用的表示日期的字符串包括RFC2822[]。此外,可能會支持一些其他的格式,但因地區、瀏覽器差異,不能確保可用(所以,建議不使用)。
其中,ISO 8601的格式,例如下面這樣的寫法:
var teaTime = new Date("2014-08-21T18:11:35");
只有兼容ECMAScript 5的瀏覽器才可用。以我自己的測試結果而言,IE8及以下不支持(返回NaN),請注意。
當前時間Date構造函數的另一個非常常用的用法是,不傳遞參數,這時候,新創建的對象將自動獲得當前日期和時間。由于這里獲得的當前時間是運行javascript的設備的系統時間,所以如果你自己手工更改了系統時間至不和真實情況一致,則javascript返回的結果也同樣不和真實情況一致。
在指定時間內阻塞javascript代碼,可以用Date實現:
var start = new Date(); while (new Date() - start < 1000) { // wait 1 second... };
這可以用于某些測試。
超出范圍的時間值如果使用超出范圍的時間值,不同的瀏覽器會有不同的處理。例如,在寫本文的時間點,我測試了Aug 20 2014 15:75:32這樣的值,Firefox 31會將其處理為Aug 20 2014 16:15:32,Chrome 36和IE9+返回Invalid Date,IE8-返回NaN。
可見,要保證正常運行,最好的做法是保證輸入的就是合法的時間值。
不使用new關鍵字的情況如果不使用關鍵字new,也就是說,直接調用Date(),則無論傳什么參數,都返回一個String字符串數據,其內容是當前時間,相當于Date.now().toString()的結果:
// will get a string like "Fri Aug 22 2014 10:10:08 GMT+0800" var teaTime = Date("Aldnoah Zero");顯示一致的時間信息
使用Date類型,一般是為了在頁面中顯示時間信息。不過,事實情況是,Date類型所有的將日期格式化為字符串的方法,包括toString()和toLocaleString(),其結果都因瀏覽器不同而不同。因此,如果要顯示一致的時間信息,應該使用getFullYear()、getMonth()等get方法依次獲取時間中的數字信息,然后自己以字符串組合的方式來組成自己想要的時間信息。例如:
var time = new Date("Aug 22 2014 16:40:54"), timeString = ""; timeString += time.getFullYear() + "-"; timeString += (time.getMonth() + 1) + "-"; timeString += time.getDate() + " "; timeString += time.getHours() + ":"; timeString += time.getMinutes() + ":"; timeString += time.getSeconds(); alert(timeString); // 2014-8-22 16:40:54 in all browsers
需要注意的是,get方法有類似getUTCHours()和getHours()這樣以UTC作為分別的情況。UTC系列的get方法返回的是前面所說的世界標準時間,時區上說就是零時區。而不帶UTC的get方法返回的是當地時間。由于我們一般會用到的時間都是當地時間(比如國內是東八區,記為UTC/GMT +0800),所以基本只會用到getHours()這種形式的方法。
有關詳細的Date類型的方法,請參考[MDN對Date的解釋][]。
獲得時區信息Date類型有一個getTimezoneOffset()的方法,它可以用來分析本地與UTC時間之間的時差。比如我自己這里調用的結果:
// -480 while I"m in china var hereTimeOffset = new Date().getTimezoneOffset();
它的結果是本地時間和UTC時間相差的分鐘數(而且是 UTC - 本地時間)。如果這個“本地”進入夏令時,這個值會有變化。
什么是夏令時?
DSTDST是指夏令時間,也叫做日光節約時間(Daylight saving time)。它是由部分國家所實施的在一年中的某一時間段(以夏季為中心,例如美國的4月到10月)內,將時間撥快1小時,以充分利用夏季較長的日光時間,節約能源的時間制度。在實行夏令時的國家中,不同國家也會有不同的夏令時實施日期。
為什么說DST會影響到getTimezoneOffset()這個值呢,看看Windows 7里的日期和時間選項:
可見,夏令時已經被集成在系統內,會對應地改變系統時間,從而影響結果。不過,你可以從上面看到,中國未實行夏令時,所以不必擔心受到影響,在此了解一下就可以了。
倒計時的制作方法如何制作一個倒計時?
首先,需要明確的是,javascript的每一個Date對象表示的雖然是一個時間點,看起來包括年月日時分秒等多重信息,但它實際是由單個數字信息體現的,這個數字就是相對于1970年1月1日凌晨0點UTC的毫秒數。因此,將時間點對應的毫秒數,做減法,然后將差值結果(也是毫秒數)依次轉化為其他不同級別的時間單位,就可以得到倒計時信息。
你可以參考[How to create a simple javascript countdown timer][]。
結語最近在完成某個日期和時間有關的功能時,發現自己對諸如UTC這樣的概念都沒有什么印象。所以,果斷地自己補習了一下,然后整理成了這篇文章。
(重新編輯自我的博客,原文地址:http://acgtofe.com/posts/2014/08/a-tale-of-date)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85267.html
摘要:注意客戶端與服務器日期進行傳輸的時候一般都是用大整數時間戳進行傳輸。 前言 一個網站的開發需要要UI、前端、后端三種工程師。現在的企業在招聘前端工程師的時候一般都要求其了解或者掌握一些后端的知識。因此,此文章主要介紹javascript的日期類型,也粗略的介紹一下php的日期類型,以及二者是如何交互數據的。 時間戳 什么是時間戳 時間戳是從格林威治時間1970年1月1日(00:0...
摘要:注意客戶端與服務器日期進行傳輸的時候一般都是用大整數時間戳進行傳輸。 前言 一個網站的開發需要要UI、前端、后端三種工程師。現在的企業在招聘前端工程師的時候一般都要求其了解或者掌握一些后端的知識。因此,此文章主要介紹javascript的日期類型,也粗略的介紹一下php的日期類型,以及二者是如何交互數據的。 時間戳 什么是時間戳 時間戳是從格林威治時間1970年1月1日(00:0...
摘要:實際上如果我們直接將字符串傳入構造函數,后臺也會調用方法。而直接與方法參數相同的值傳入構造函數,獲取的日期對象都是基于系統設置的本地時間創建的。中國標準時間中國標準時間中國標準時間由上面的代碼可以發現,其實是的引用,發生變化時,也隨之改變。 最近的項目需要實現一個時間表格的效果,如下圖所示,每次更換第幾周時也更新對應的日期。使用了Date類型,也踩了些坑。故寫下此篇筆記。 showIm...
摘要:一起來看看中的日期對象。對象和其他對象如等一樣,對象是語言中的內建對象。在工作中,對象有著許多重要的應用。這意味著,當前時間與標準時區相差小時。,全稱是國際標準化組織,負責制定全世界工商業國際標準的國際標準。 原文地址: http://www.wemlion.com/2016/d... 時間的發現 日常生活中,各種形式的時間字符到處都是。 時間觀念的產生,時間單位、計時工具的發明,給人...
閱讀 1818·2023-04-26 02:51
閱讀 2849·2021-09-10 10:50
閱讀 3026·2021-09-01 10:48
閱讀 3594·2019-08-30 15:53
閱讀 1816·2019-08-29 18:40
閱讀 405·2019-08-29 16:16
閱讀 2024·2019-08-29 13:21
閱讀 1816·2019-08-29 11:07