国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

聊聊 JavaScript 中的 Date 對象

adie / 3931人閱讀

摘要:一起來看看中的日期對象。對象和其他對象如等一樣,對象是語言中的內建對象。在工作中,對象有著許多重要的應用。這意味著,當前時間與標準時區相差小時。,全稱是國際標準化組織,負責制定全世界工商業國際標準的國際標準。

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

時間的發現

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

時間觀念的產生,時間單位、計時工具的發明,給人類帶來的變化實在一言難盡。

今天就來談談日期那些事兒。一起來看看 JavaScript 中的日期對象 Date。

Date 對象

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

創建一個 Date 實例很簡單,下面簡單回顧下常用的方法。

獲取當前時間

var now = new Date();

注意,JavaScript 中的當前時間與操作系統相關。因此,在重要的 Web 應用中,應該會避免使用該時間,更可靠的方式是操作前先請求服務器獲取時間,或者將工作直接交給服務端。

生成時間

// 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");

上面只是最常見的幾種形式。實際應用中會發現,Date 對象非常強大,能夠解析多種格式的字符串。本文暫且略過不表。

值得一提的是,上面 new Date("2016-08-31") 這種形式應當盡量避免。如果沒有記錯,iOS 系統環境中,這種格式會報錯,遇到該格式的字符串時,應該一律先進行替換操作:

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

獲取或修改更多時間細節

Date 對象提供了一系列 set get 方法供我們使用。方法名也很語義化。在此略過。

眼花繚亂的時間字符串

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

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

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

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

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

接下來,主要通過 JavaScript 中的 to***String 系列方法,了解這些時間字符串。

一堆 to***String 方法

首先,讓我們寫個簡單的腳本,看看 Date 對象到底有哪些 to***String 方法。

注意,這些方法是無法通過 for in 循環取到的,也就是說,默認是 enumerable: false

使用 Object.getOwnPropertyDescriptor 方法可以查看這些細節。

toString 為例,一起看下:

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

結果如下:

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

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

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

(寫到這里,雖然看上去很啰嗦,但我總覺得有必要把細節記下來。萬一下次又記不清了呢。)

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

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

一共有 9 個,如下:

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

看名稱大概也能知道,這 9 個方法可以分為三組。下面按組來細看。

toString 系列

接下來,我們所有的實驗,統一使用一個 Date 實例。需要說明的,我所使用的是 Chrome 52,所有實驗都是在控制臺中進行的。

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

一并展示出所有結果吧,就是這么簡單粗暴。

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

根據 ECMA-262 標準,toString() toDateString() toTimeString() 執行的結果,是實現相關的(implementation-dependent)。

toDateString() 為例,看看標準中的是如何說的:

該方法返回一個 String 類型的值。該值是實現相關的,但其目的是以一種簡便、便于閱讀的形式,展示 Date 實例在當前時區內的“日期”部分。
—— ECMA-262 7?? Edition

再來看看結果中的 GMT+0800 是什么鬼。所謂 GMT,是英文 “Greenwich Mean Time” 的縮寫,完整翻譯過來就是“格林尼治平時”,也就是通常所說的“格林尼治時間”,即位于英國倫敦郊區的皇家格林尼治天文臺的標準時間。詳細信息可以查看維基百科。

至于“+0800”,則是時區的概念了。這意味著,當前時間與標準時區相差 8 小時。

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

像 BST、CST 這些標志,就像上面表格中的“中國標準時間”一樣。這些是用來說明時區的,通常用縮寫表示,不過這并不是標準。CST 正好就是中國標準時間(China Standar Time)的縮寫,可以參考 timeanddate 這個網站。

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

toLocaleString 系列

執行結果如下圖所示:

也很好理解。這三個方法,也是和實現相關的。[標準]中有一句很關鍵,“與宿主環境當前區域設置的約定保持一致”("corresponds to the conventions of the host environment"s current locale.")。

標準時間系列

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

這些年,想必各種商業廣告已經幫我們普及了 ISO 的概念,八九歲的時候就知道,某某品牌的摩托車號稱通過 ISO-2001 標準。ISO,全稱是國際標準化組織(International Organization for Standardization),負責制定全世界工商業國際標準的國際標準。

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

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

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

UTC 是“世界標準時間”的簡稱,又作“協調世界時” “世界協調時間”,英文是 Coordinated Universal Time。下面引用下維基百科中的說明:

協調世界時是世界上調節時鐘和時間的主要時間標準,它與0度經線的平太陽時相差不超過1秒,并不遵守夏令時。協調世界時是最接近格林尼治標準時間(GMT)的幾個替代時間系統之一……
UTC基于國際原子時,并通過不規則的加入閏秒來抵消地球自轉變慢的影響。

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

還是引用維基百科中的一段,來看看 UTC 時間和格林尼治時間的不同。

理論上來說,格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時(也就是在格林尼治上空最高點時)的時間。由于地球在它的橢圓軌道里的運動速度不均勻,這個時刻可能與實際的太陽時有誤差,最大誤差達16分鐘。
由于地球每天的自轉是有些不規則的,而且正在緩慢減速,因此格林尼治時間已經不再被作為標準時間使用。現在的標準時間,是由原子鐘報時的協調世界時(UTC)。

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

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.

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

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

從字符串中提取時間,已經有很多工具,還相當智能,英文不必說,中文的“前天”“五天前”“上周三”之類的不在話下。

臨時應急,也僅僅是為了辨別一些常用的日期字符串,我也寫了一個小工具,主要是提取日期。

關鍵的正則表達式如下:

// 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 (中國標準時間)"
    /(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");

詳細代碼,可見 Github。之后有時間,也會考慮加入更智能的識別功能。

參考

http://www.timeanddate.com/

wikipedia

ECMAScript? 2016 Language Specification

http://wwp.greenwichmeantime.com/

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80271.html

相關文章

  • 聊聊webWorker

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

    luffyZh 評論0 收藏0
  • 聊聊Java的泛型及實現

    摘要:靜態變量是被泛型類的所有實例所共享的。所以引用能完成泛型類型的檢查。對于這個類型系統,有如下的一些規則相同類型參數的泛型類的關系取決于泛型類自身的繼承體系結構。事實上,泛型類擴展都不合法。 前言 和C++以模板來實現靜多態不同,Java基于運行時支持選擇了泛型,兩者的實現原理大相庭徑。C++可以支持基本類型作為模板參數,Java卻只能接受類作為泛型參數;Java可以在泛型類的方法中取得...

    lewif 評論0 收藏0
  • PHP中的日期時間處理利器-Carbon

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

    edagarli 評論0 收藏0
  • 簡單聊聊DOM

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

    MASAILA 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<