成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

聊聊 JavaScript 中的 Date 對(duì)象

adie / 3939人閱讀

摘要:一起來(lái)看看中的日期對(duì)象。對(duì)象和其他對(duì)象如等一樣,對(duì)象是語(yǔ)言中的內(nèi)建對(duì)象。在工作中,對(duì)象有著許多重要的應(yīng)用。這意味著,當(dāng)前時(shí)間與標(biāo)準(zhǔn)時(shí)區(qū)相差小時(shí)。,全稱是國(guó)際標(biāo)準(zhǔn)化組織,負(fù)責(zé)制定全世界工商業(yè)國(guó)際標(biāo)準(zhǔn)的國(guó)際標(biāo)準(zhǔn)。

原文地址: http://www.wemlion.com/2016/d...

時(shí)間的發(fā)現(xiàn)

日常生活中,各種形式的時(shí)間字符到處都是。

時(shí)間觀念的產(chǎn)生,時(shí)間單位、計(jì)時(shí)工具的發(fā)明,給人類帶來(lái)的變化實(shí)在一言難盡。

今天就來(lái)談?wù)勅掌谀切┦聝?。一起?lái)看看 JavaScript 中的日期對(duì)象 Date。

Date 對(duì)象

和其他對(duì)象如 Math、RegExp 等一樣,Date 對(duì)象是 JavaScript 語(yǔ)言中的內(nèi)建(build-in)對(duì)象。在工作中,Date 對(duì)象有著許多重要的應(yīng)用。

創(chuàng)建一個(gè) Date 實(shí)例很簡(jiǎn)單,下面簡(jiǎn)單回顧下常用的方法。

獲取當(dāng)前時(shí)間

var now = new Date();

注意,JavaScript 中的當(dāng)前時(shí)間與操作系統(tǒng)相關(guān)。因此,在重要的 Web 應(yīng)用中,應(yīng)該會(huì)避免使用該時(shí)間,更可靠的方式是操作前先請(qǐng)求服務(wù)器獲取時(shí)間,或者將工作直接交給服務(wù)端。

生成時(shí)間

// 2016-08-31 23:27:22
new Date(2016, 7, 31, 23, 27, 22);
new Date("2016-08-31 23:27:22");
new Date("2016/08/31 23:27:22");

上面只是最常見的幾種形式。實(shí)際應(yīng)用中會(huì)發(fā)現(xiàn),Date 對(duì)象非常強(qiáng)大,能夠解析多種格式的字符串。本文暫且略過(guò)不表。

值得一提的是,上面 new Date("2016-08-31") 這種形式應(yīng)當(dāng)盡量避免。如果沒有記錯(cuò),iOS 系統(tǒng)環(huán)境中,這種格式會(huì)報(bào)錯(cuò),遇到該格式的字符串時(shí),應(yīng)該一律先進(jìn)行替換操作:

var string = "2016-08-31";
var date = new Date(string.replace(/-/g, "/"));

獲取或修改更多時(shí)間細(xì)節(jié)

Date 對(duì)象提供了一系列 set get 方法供我們使用。方法名也很語(yǔ)義化。在此略過(guò)。

眼花繚亂的時(shí)間字符串

在工作中,常常會(huì)接觸各種不同格式的時(shí)間字符串。除了那些格式整齊,地球人幾乎都能讀懂的之外,還有一些不那么為普通人所了解的格式。

與此同時(shí),細(xì)心的同學(xué)可能注意到,在控制臺(tái)中輸入一個(gè) Date 變量的引用,按下 . 的那一刻,會(huì)有一大堆屬性、方法提示。除去 set get 這一類方法之外,還有一堆 to***String 形式的方法。相信多數(shù)同學(xué)用得不多。

往前數(shù)月,我也不太關(guān)注這些東西。但后來(lái)某次,后端返回的數(shù)據(jù)總是隨機(jī)地有一些數(shù)據(jù)是 2016-08-31T15:44:30.244Z 這種格式的。當(dāng)時(shí)不明白其含義,只能自作聰明地拿正則表達(dá)式來(lái)匹配,作為容錯(cuò)方案。

接下來(lái),自己的一個(gè)小爬蟲工具想要支持 rss 解析。拿到的不少日期數(shù)據(jù)是 Thu Aug 25 2016 01:31:50 GMT+0800 (CST) 這種格式的。

由此我開始試著去了解這些看上去奇奇怪怪的日期格式。

接下來(lái),主要通過(guò) JavaScript 中的 to***String 系列方法,了解這些時(shí)間字符串。

一堆 to***String 方法

首先,讓我們寫個(gè)簡(jiǎn)單的腳本,看看 Date 對(duì)象到底有哪些 to***String 方法。

注意,這些方法是無(wú)法通過(guò) for in 循環(huán)取到的,也就是說(shuō),默認(rèn)是 enumerable: false。

使用 Object.getOwnPropertyDescriptor 方法可以查看這些細(xì)節(jié)。

toString 為例,一起看下:

Object.getOwnPropertyDescriptor(Date.prototype, "toString");

結(jié)果如下:

{
    writable: true,
    enumerable: false,
    configurable: true,
    value: function toString(),
    __proto__: Object
}

既然不能通過(guò) for in 遍歷,那還有沒有其他辦法呢?

有的。Object.getOwnPropertyNames 這個(gè)方法可以幫我們拿到對(duì)象自身屬性的 key 值。

(寫到這里,雖然看上去很啰嗦,但我總覺得有必要把細(xì)節(jié)記下來(lái)。萬(wàn)一下次又記不清了呢。)

接著,就可以愉快地取到所有的 to***String 方法名了。

let proto = Date.prototype;
let names = Object.getOwnPropertyNames(proto).filter((name) => /^to[a-zA-Z]*String/.test(name));
console.log(names);

一共有 9 個(gè),如下:

[ "toString",
  "toDateString",
  "toTimeString",
  "toISOString",
  "toUTCString",
  "toGMTString",
  "toLocaleString",
  "toLocaleDateString",
  "toLocaleTimeString"
]

看名稱大概也能知道,這 9 個(gè)方法可以分為三組。下面按組來(lái)細(xì)看。

toString 系列

接下來(lái),我們所有的實(shí)驗(yàn),統(tǒng)一使用一個(gè) Date 實(shí)例。需要說(shuō)明的,我所使用的是 Chrome 52,所有實(shí)驗(yàn)都是在控制臺(tái)中進(jìn)行的。

// 2016-09-02 10:49:22
var date = new Date(2016, 8, 2, 10, 49, 22);

一并展示出所有結(jié)果吧,就是這么簡(jiǎn)單粗暴。

注意到,date + ""date.toString() 的結(jié)果是一樣的。這不是偶然,它們實(shí)際上是等價(jià)的。這涉及到 JavaScript 中的隱式類型轉(zhuǎn)換

根據(jù) ECMA-262 標(biāo)準(zhǔn),toString() toDateString() toTimeString() 執(zhí)行的結(jié)果,是實(shí)現(xiàn)相關(guān)的(implementation-dependent)。

toDateString() 為例,看看標(biāo)準(zhǔn)中的是如何說(shuō)的:

該方法返回一個(gè) String 類型的值。該值是實(shí)現(xiàn)相關(guān)的,但其目的是以一種簡(jiǎn)便、便于閱讀的形式,展示 Date 實(shí)例在當(dāng)前時(shí)區(qū)內(nèi)的“日期”部分。
—— ECMA-262 7?? Edition

再來(lái)看看結(jié)果中的 GMT+0800 是什么鬼。所謂 GMT,是英文 “Greenwich Mean Time” 的縮寫,完整翻譯過(guò)來(lái)就是“格林尼治平時(shí)”,也就是通常所說(shuō)的“格林尼治時(shí)間”,即位于英國(guó)倫敦郊區(qū)的皇家格林尼治天文臺(tái)的標(biāo)準(zhǔn)時(shí)間。詳細(xì)信息可以查看維基百科。

至于“+0800”,則是時(shí)區(qū)的概念了。這意味著,當(dāng)前時(shí)間與標(biāo)準(zhǔn)時(shí)區(qū)相差 8 小時(shí)。

比如,此刻是北京時(shí)間 2016 年 9 月 2 日 13:07:22,也就是 Fri Sep 02 2016 13:07:22 GMT+0800,那么此時(shí),格林尼治時(shí)區(qū)的時(shí)間就應(yīng)該是 05:07:22。不過(guò),從世界時(shí)鐘中此時(shí)英國(guó)倫敦的時(shí)間是 06:07:22。為何會(huì)有此差別?因?yàn)?9 月 2 號(hào)的時(shí)候,倫敦使用的是 BST 時(shí)區(qū),即 British Summer Time,也就是眾所周知的“夏令時(shí)”。

像 BST、CST 這些標(biāo)志,就像上面表格中的“中國(guó)標(biāo)準(zhǔn)時(shí)間”一樣。這些是用來(lái)說(shuō)明時(shí)區(qū)的,通常用縮寫表示,不過(guò)這并不是標(biāo)準(zhǔn)。CST 正好就是中國(guó)標(biāo)準(zhǔn)時(shí)間(China Standar Time)的縮寫,可以參考 timeanddate 這個(gè)網(wǎng)站。

不過(guò),上面僅僅是提到格林尼治時(shí)間。并不意味著真正用到了它。JavaScript 中實(shí)際使用到的,還是 UTC 時(shí)間。

toLocaleString 系列

執(zhí)行結(jié)果如下圖所示:

也很好理解。這三個(gè)方法,也是和實(shí)現(xiàn)相關(guān)的。[標(biāo)準(zhǔn)]中有一句很關(guān)鍵,“與宿主環(huán)境當(dāng)前區(qū)域設(shè)置的約定保持一致”("corresponds to the conventions of the host environment"s current locale.")。

標(biāo)準(zhǔn)時(shí)間系列

接著看 toISOString() toUTCString() toGMTString() 三個(gè)方法。按照慣例,先看結(jié)果:

這些年,想必各種商業(yè)廣告已經(jīng)幫我們普及了 ISO 的概念,八九歲的時(shí)候就知道,某某品牌的摩托車號(hào)稱通過(guò) ISO-2001 標(biāo)準(zhǔn)。ISO,全稱是國(guó)際標(biāo)準(zhǔn)化組織(International Organization for Standardization),負(fù)責(zé)制定全世界工商業(yè)國(guó)際標(biāo)準(zhǔn)的國(guó)際標(biāo)準(zhǔn)。

JavaScript 標(biāo)準(zhǔn)定義的時(shí)間交換格式(interchange format),是基于 ISO 8601 擴(kuò)展格式的簡(jiǎn)化版本,格式是 “YYYY-MM-DDTHH:mm:ss.sssZ”。toISOString() 返回的就是這樣的字符串。

T 只是一個(gè)字面量,標(biāo)志著接下來(lái)的內(nèi)容是時(shí)間(相對(duì)于前面的日期而言)。Z 標(biāo)志著時(shí)差。直接使用 Z,意味著我們使用的是表示時(shí)間(UTC)。在我們的例子中,date.toISOString() 的結(jié)果是 2016-09-02T02:49:22.000Z,可以看到,和我們的實(shí)際時(shí)間 10:49:22 相差了 8 小時(shí)。

當(dāng)然,Z 的位置上,還可以使用+HH:mm -HH:mm 的形式。這樣就是直接指定與標(biāo)準(zhǔn)時(shí)間的時(shí)差了。例如,2016-09-02T02:49:22.000Z 作為標(biāo)準(zhǔn)時(shí)間,相當(dāng)于北京時(shí)間的 10:49:22,換一種形式就是 2016-09-02T10:49:22.000+08:00

UTC 是“世界標(biāo)準(zhǔn)時(shí)間”的簡(jiǎn)稱,又作“協(xié)調(diào)世界時(shí)” “世界協(xié)調(diào)時(shí)間”,英文是 Coordinated Universal Time。下面引用下維基百科中的說(shuō)明:

協(xié)調(diào)世界時(shí)是世界上調(diào)節(jié)時(shí)鐘和時(shí)間的主要時(shí)間標(biāo)準(zhǔn),它與0度經(jīng)線的平太陽(yáng)時(shí)相差不超過(guò)1秒,并不遵守夏令時(shí)。協(xié)調(diào)世界時(shí)是最接近格林尼治標(biāo)準(zhǔn)時(shí)間(GMT)的幾個(gè)替代時(shí)間系統(tǒng)之一……
UTC基于國(guó)際原子時(shí),并通過(guò)不規(guī)則的加入閏秒來(lái)抵消地球自轉(zhuǎn)變慢的影響。

我們注意到,toUTCString() toGMTString() 兩者返回的字符串是一樣的。實(shí)際上,這還是和具體實(shí)現(xiàn)有關(guān)。

還是引用維基百科中的一段,來(lái)看看 UTC 時(shí)間和格林尼治時(shí)間的不同。

理論上來(lái)說(shuō),格林尼治標(biāo)準(zhǔn)時(shí)間的正午是指當(dāng)太陽(yáng)橫穿格林尼治子午線時(shí)(也就是在格林尼治上空最高點(diǎn)時(shí))的時(shí)間。由于地球在它的橢圓軌道里的運(yùn)動(dòng)速度不均勻,這個(gè)時(shí)刻可能與實(shí)際的太陽(yáng)時(shí)有誤差,最大誤差達(dá)16分鐘。
由于地球每天的自轉(zhuǎn)是有些不規(guī)則的,而且正在緩慢減速,因此格林尼治時(shí)間已經(jīng)不再被作為標(biāo)準(zhǔn)時(shí)間使用?,F(xiàn)在的標(biāo)準(zhǔn)時(shí)間,是由原子鐘報(bào)時(shí)的協(xié)調(diào)世界時(shí)(UTC)。

ES 2016 中提到,toGMTString() 主要是用來(lái)滿足舊代碼兼容性的,新代碼中推薦使用 toUTCString()。標(biāo)準(zhǔn)還提到這么一句:

The function object that is the initial value of Date.prototype.toGMTString is the same function object that is the initial value of Date.prototype.toUTCString.

也就是說(shuō),在 JavaScript 中,toUTCString() toGMTString() 這倆是一樣的。

assertEqual(date.toGMTString, date,toUTCString);
日期提取工具

從字符串中提取時(shí)間,已經(jīng)有很多工具,還相當(dāng)智能,英文不必說(shuō),中文的“前天”“五天前”“上周三”之類的不在話下。

臨時(shí)應(yīng)急,也僅僅是為了辨別一些常用的日期字符串,我也寫了一個(gè)小工具,主要是提取日期。

關(guān)鍵的正則表達(dá)式如下:

// 2012 年 2 月 28 日
re_zh  = /(d{4})s*[^x00-xff]s*(d{1,2})s*[^x00-xff]s*(d{1,2})s*[^x00-xff]/,

// 2012-02-28, 2012.02.28, 2012/02/28
re_ymd = /d{4}([/-.])d{1,2}(1)d{1,2}/,

// 02/28/2012 etc.
re_mdy = /d{1,2}([/-.])d{1,2}(1)d{4}/,

re_en  = new RegExp([
    // toUTCString(): "Tue, 30 Aug 2016 03:01:19 GMT"
    /(w{3}), (d{2}) (w{3}) (d{4}) ((d{2}):(d{2}):(d{2})) GMT/.source,

    // toString():  "Tue Aug 30 2016 11:02:45 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)"
    /(w{3}) (w{3}) (d{2}) (d{4}) ((d{2}):(d{2}):(d{2})) GMT+d{4}/.source,

    // toISOString(): "2016-08-30T03:01:19.543Z"
    /(d{4})-(d{2})-(d{2})T((d{2}):(d{2}):(d{2})).(d{3})Z/.source,
    
    // toDateString(): "Tue Aug 30 2016"
    /(w{3}) (w{3}) (d{2}) (d{4})/.source
].join("|"), "m");

詳細(xì)代碼,可見 Github。之后有時(shí)間,也會(huì)考慮加入更智能的識(shí)別功能。

參考

http://www.timeanddate.com/

wikipedia

ECMAScript? 2016 Language Specification

http://wwp.greenwichmeantime.com/

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80271.html

相關(guān)文章

  • 聊聊webWorker

    摘要:不過(guò),這并不意味著語(yǔ)言本身就支持了多線程,對(duì)于語(yǔ)言本身它仍是運(yùn)行在單線程上的,只是瀏覽器宿主環(huán)境提供的一個(gè)能力。主線程與子線程之間也可以交換二進(jìn)制數(shù)據(jù),比如等對(duì)象,也可以在線程之間發(fā)送。 先看幾個(gè)例子 本例子是通過(guò)通過(guò)紅點(diǎn)展示地球上的地震帶,數(shù)據(jù)來(lái)自于地質(zhì)探測(cè)局通過(guò)console.log看到數(shù)據(jù)運(yùn)算所耗的時(shí)間不使用 webworker No web workers - all on ...

    luffyZh 評(píng)論0 收藏0
  • 聊聊Java的泛型及實(shí)現(xiàn)

    摘要:靜態(tài)變量是被泛型類的所有實(shí)例所共享的。所以引用能完成泛型類型的檢查。對(duì)于這個(gè)類型系統(tǒng),有如下的一些規(guī)則相同類型參數(shù)的泛型類的關(guān)系取決于泛型類自身的繼承體系結(jié)構(gòu)。事實(shí)上,泛型類擴(kuò)展都不合法。 前言 和C++以模板來(lái)實(shí)現(xiàn)靜多態(tài)不同,Java基于運(yùn)行時(shí)支持選擇了泛型,兩者的實(shí)現(xiàn)原理大相庭徑。C++可以支持基本類型作為模板參數(shù),Java卻只能接受類作為泛型參數(shù);Java可以在泛型類的方法中取得...

    lewif 評(píng)論0 收藏0
  • PHP中的日期時(shí)間處理利器-Carbon

    摘要:介紹是中很人性化的時(shí)間日期處理插件,擁有接近個(gè)。最大的特點(diǎn)就是靈活人性化。 Carbon介紹 Carbon是PHP中很人性化的時(shí)間日期處理插件,github擁有接近5000個(gè) star。github地址為:https://github.com/briannesbi... Carbon基本用法 //1、基本應(yīng)用 $now = Carbon::now(); ...

    edagarli 評(píng)論0 收藏0
  • 簡(jiǎn)單聊聊DOM

    摘要:討論在如何去使用元素用于在頁(yè)面中嵌入或引入腳本代碼,該元素默認(rèn)被定義在元素中頁(yè)面內(nèi)容該屬性定義規(guī)定的文本類型,可以為類型也可以為類型等其他類型和屬性類似,這個(gè)屬性定義腳本使用的語(yǔ)言,該屬性不是標(biāo)準(zhǔn)規(guī)范定義引用外部腳本的內(nèi)嵌代碼與內(nèi) 討論在HTML如何去使用JavaScript 元素用于在HTML頁(yè)面中嵌入或引入JavaScript腳本代碼,該元素默認(rèn)被定義在元素中 HTML頁(yè)面內(nèi)容: ...

    MASAILA 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<