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

資訊專欄INFORMATION COLUMN

需要知道的JS的日期知識,都在這了

testbird / 510人閱讀

摘要:實際上是格林威治標準時間的同義詞默認情況下,中的幾乎每個日期方法除了一個都是本地時間。如果你住在格林威治標準時間晚的的地區(qū),你會得到一個日期是月日。需要知道對象日期方法。

為了保證的可讀性,本文采用意譯而非直譯。

想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你!

JS中的 Date 很奇怪。當我們需要處理日期和時間的時候比較麻煩,經(jīng)常借助像date-fns和 Moment 這樣的庫。

但是我們并不總是需要使用庫。如果知道要注意一些總是,日期實際上可以非常簡單。接下介紹有關(guān)Date對象的所有信息

時區(qū)

我們的世界有數(shù)百個時區(qū)。 在JavaScript中,我們只關(guān)心兩個, 本地時間協(xié)調(diào)世界時(UTC)。

本地時間是指你的計算機所在的時區(qū)。

UTC實際上是格林威治標準時間(GMT)的同義詞

默認情況下,JS中的幾乎每個日期方法(除了一個)都是本地時間。 只有指定UTC,才能獲得 UTC 時間 。

創(chuàng)建日期

可以使用 new Date() 來創(chuàng)建日期,傳入的參數(shù)通常有4種常用的方式:

使用日期字符串參數(shù)

使用一系列的參數(shù)

時間戳參數(shù)

不帶參數(shù)

使用日期字符串參數(shù)
new Date("1988-03-21")

這種方式方便且直觀。

如果現(xiàn)在寫的是21-03-1988,我們可以毫不費力想表達的是1988年3月21日。但是如果用JS 編寫21-03-1988,則會得到無效的日期。

這是有原因的。

在世界的不同地方以不同的方式解釋日期字符串。 例如11-06-20192019年6月11日還是 2019年11月6日。你不能確定我指的是哪一個,除非你知道我正在使用的日期系統(tǒng)。

在JS中,如果要使用日期字符串參數(shù),則需要使用全球都能接受的格式,其中一種格式是ISO 8601擴展格式。

// ISO 8601 Extended format
`YYYY-MM-DDTHH:mm:ss:sssZ`

YYYY:4位數(shù)年份

MM:兩位數(shù)月份(即 1月為01,12月為12)

DD:兩位數(shù)的日期(0到31)

-:日期分隔符

T:表示開始時間

HH:24位小時數(shù)(0到23)

mm:分鐘(0到59)

ss:秒(0到59)

sss:毫秒(0到999)

::時間分隔符

Z:如果存在Z,則日期將設(shè)置為UTC,如果Z不存在,則為本地時間。

其中小時,分鐘,秒和毫秒是可選的,如果你想創(chuàng)建一個2019年6月11日的日期,可以這樣寫:

new Date("2019-06-11")    

在這里要特別注意,使用日期字符串參數(shù)創(chuàng)建日期存在很大問題,把創(chuàng)建的日期打印出來就可以發(fā)現(xiàn)問題。

如果你住在格林威治標準時間(GMT)晚的的地區(qū),你會得到一個日期是6月10日

如果你住在比格林威治標準時間早的地區(qū),才會等得到6月11日的日期。

發(fā)生這種情況是因為日期字符串參數(shù)的方法具有特殊行為:如果創(chuàng)建日期(未指定時間),則會獲得UTC格式設(shè)置的日期。

在上面的場景中,使用new Date("2019-06-11") 創(chuàng)建日期時,實際上創(chuàng)建的日期是2019年6月11日,UTC時間上午12點。這就是為什么住在格林尼治標準時間之后的地區(qū)的人得到的是6月10日而不是6月11日

如果要使用日期字符串參數(shù)方法在“本地時間”中創(chuàng)建日期,則需要包括時間。如果包含時間,則需要至少寫入HHmm

new Date("2019-06-11T00:00")  

使用日期字符串參數(shù)的創(chuàng)建的本地時間與UTC的比較可能是一個難以捕捉的錯誤。所以,建議不要使用日期字符串創(chuàng)建日期方式。

格林威治標準時間GMT 
十七世紀,格林威治皇家天文臺為了海上霸權(quán)的擴張計畫而進行天體觀測。1675年舊皇家觀測所(Old Royal Observatory) 正式成立,到了1884年決定以通過格林威治的子午線作為劃分地球東西兩半球的經(jīng)度零度。觀測所門口墻上有一個標志24小時的時鐘,顯示當下的時間,對全球而言,這里所設(shè)定的時間是世界時間參考點,全球都以格林威治的時間作為標準來設(shè)定時間,這就是我們耳熟能詳?shù)摹父窳滞螛藴蕰r間(Greenwich Mean Time,簡稱G.M.T.)的由來,標示在手表上,則代表此表具有兩地時間功能,也就是同時可以顯示原居地和另一個國度的時間。

世界協(xié)調(diào)時間UTC
多數(shù)的兩地時間表都以GMT來表示,但也有些兩地時間表上看不到GMT字樣,出現(xiàn)的反而是UTC這3個英文字母,究竟何謂UTC?事實上,UTC指的是Coordinated Universal Time- 世界協(xié)調(diào)時間(又稱世界標準時間、世界統(tǒng)一時間),是經(jīng)過平均太陽時(以格林威治時間GMT為準)、地軸運動修正后的新時標以及以「秒」為單位的國際原子時所綜合精算而成的時間,計算過程相當嚴謹精密,因此若以「世界標準時間」的角度來說,UTC比GMT來得更加精準。其誤差值必須保持在0.9秒以內(nèi),若大于0.9秒則由位于巴黎的國際地球自轉(zhuǎn)事務(wù)中央局發(fā)布閏秒,使UTC與地球自轉(zhuǎn)周期一致。所以基本上UTC的本質(zhì)強調(diào)的是比GMT更為精確的世界時間標準,不過對于現(xiàn)行表款來說,GMT與UTC的功能與精確度是沒有差別的。

使用一系列的參數(shù)創(chuàng)建

最多可以傳入七個參數(shù)來創(chuàng)建日期/時間。

Year:4位數(shù)年份

Month:一年中的某月(0-11)

Day:每月的某天(1-31),如果省略,則默認為1。

Hour:一天中的小時(0-23),如果省略,則默認為0。

Minutes:分鐘(0-59),如果省略,則默認為0。

Seconds:秒(0-59),如果省略,則默認為0。

Milliseconds:毫秒(0-999),如果省略,則默認為0。

// 11th June 2019, 5:23:59am, Local Time
new Date(2019, 5, 11, 5, 23, 59)

許多開發(fā)人員比較少用這種方式,因為它看起來很復雜,但它實際上非常簡單。可以從左到右記憶:年、月、日、小時、分鐘、秒和毫秒。

Date 中需要注意的地方Month是從0開始的,如1月=== 0,2月=== 1,3月=== 2,依此類推。

再來一些事件熟悉一下多個參數(shù)的用法

// 21st March 1988, 12am, Local Time.
new Date(1988, 2, 21)

// 25th December 2019, 8am, Local Time.
new Date(2019, 11, 25, 8)

// 6th November 2023, 2:20am, Local Time
new Date(2023, 10, 6, 2, 20)

// 11th June 2019, 5:23:59am, Local Time
new Date(2019, 5, 11, 5, 23, 59)

注意,使用參數(shù)創(chuàng)建的日期都是用本地時間

使用參數(shù)的還有一個好處是不會在本地時間和UTC之間混淆,如果需要UTC時間,請以這種方式創(chuàng)建UTC 日期:

// 11th June 2019, 12am, UTC.
new Date(Date.UTC(2019, 5, 11))
使用時間戳來創(chuàng)建日期

在JS中,時間戳是自1970年1月1日以來經(jīng)過的毫秒數(shù)(1970年1月1日也稱為Unix紀元時間)。 根據(jù)我的經(jīng)驗,很少使用時間戳來創(chuàng)建日期,一般使用時間戳來比較不同的日期或者格式化日期,后面在討論。

不帶參數(shù)的形式創(chuàng)建日期

如果創(chuàng)建沒有任何參數(shù)的日期,則會將日期設(shè)置為當前時間(以本地時間為單位)。

new Date()

小結(jié)一波

使用 new Date() 創(chuàng)建日期

有四種可能的語法:

使用字符串日期值

使用一系列參數(shù)

使用時間戳

不帶參數(shù)

最好不要使用字符串日期值的方法創(chuàng)建日期

最好使用一系列參數(shù)方式創(chuàng)建日期

記住月份是從0開始的

格式化日期

多數(shù)編程語言都提供了一種格式工具來創(chuàng)您想要的任何日期格式 例如,在PHP中,可以將date("d M Y")格式化成23 1月 2019這樣的日期。

但是在JS 中格式化日期并不容易。

原生 Date 對象提供了七種格式化方法,這七種方法中的每一種都會給你一個特定的價值,而且它們毫無用處。

const date = new Date(2019, 0, 23, 17, 23, 42)

toString:格式化成 "Wed Jan 23 2019 17:23:42 GMT+0800 (中國標準時間)"

toDateString: 格式化成 "Wed Jan 23 2019"

toLocaleString:格式化成 "2019/1/23 下午5:23:42"

toLocaleDateString:格式化成 "2019/1/23"

toGMTString:格式化成 "Wed, 23 Jan 2019 09:23:42 GMT"

toUTCString:格式化成 "Wed, 23 Jan 2019 09:23:42 GMT"

toISOString :格式化成 "2019-01-23T09:23:42.000Z"

如果需要自定義格式,則要自己創(chuàng)建。

編寫自定義日期格式

假設(shè)想要 2019年1月23日 星期四這樣的日期格式。需要知道 Date對象日期方法。

要獲取這樣的格式,用到 Date 中的四個方法:

getFullYear:獲取當?shù)貢r間4位數(shù)的年份

getMonth:獲取當時時間的月份,注意從 0 開始

getDate:獲取當?shù)貢r間月中的某一天(1-31)

getDay:獲取當?shù)貢r間的星期幾(0-6),星期日(0)開始,到星期六(6)結(jié)束。

const d = new Date(2019, 0, 23)
const year = d.getFullYear() // 2019
const date = d.getDate() // 23

因為星期和月份是從0開始的,所以我們可以創(chuàng)建一個映射表:

const months = {
  0: "1月",
  1: "2月",
  2: "3月",
  3: "4月",
  4: "5月",
  5: "6月",
  6: "7月",
  7: "8月",
  8: "9月",
  9: "10月",
  10: "11月",
  11: "12月"
}

由于月份是0開始的的,我們可以使用數(shù)組代替對象,結(jié)果一樣:

const months = [
  "1月",
  "2月",
  "3月",
  "4月",
  "5月",
  "6月",
  "7月",
  "8月",
  "9月",
  "10月",
  "11月",
  "12月"
}

要得到1月份,你需要

const monthIndex = d.getMonth()
const monthName = months[monthIndex]
console.log(monthName) // 1月

簡化一下:

const monthName = months(d.getMonth())
console.log(monthName) // 1月

為了獲取 星期四,還需要 做同樣的事情:

const days = [
  "星期日",
  "星期一",
  "星期二",
  "星期三",
  "星期四",
  "星期五",
  "星期六"
]

獲取方式:

const dayName = days[d.getDay()] // 星期四

接著就產(chǎn)拼接起來。這是相對乏味的。

如果需要創(chuàng)建自定義格式的時間,可以使用以下方法

getHours:獲取當?shù)貢r間獲取小時數(shù)(0-23)。

getMinutes:獲取本地時間獲取分鐘(0-59)。

getSeconds:獲取本地時間獲取秒數(shù)(0-59)。

getMilliseconds:獲取本地時間獲取毫秒(0-999)。

日期的比較

比較日期的前后,可以直接使用>, <, >=<= 時行比較。

const earlier = new Date(2019, 0, 26)
const later = new Date(2019, 0, 27)

console.log(earlier < later) // true

比較兩個日期是否一樣,就比較麻煩,不能直接用 =====

const a = new Date(2019, 0, 26)
const b = new Date(2019, 0, 26)

console.log(a == b) // false
console.log(a === b) // false

可以getTime獲取它們的時間戳,用時間戳進行比較。

const isSameTime = (a, b) => {
  return a.getTime() === b.getTime()
}

const a = new Date(2019, 0, 26)
const b = new Date(2019, 0, 26)
console.log(isSameTime(a, b)) // true

如果只想檢查兩個日期是否在同一天,可以比較他們的getFullYeargetMonthgetDate值。

const isSameDay = (a, b) => {
  return a.getFullYear() === b.getFullYear() &&
    a.getMonth() === b.getMonth() &&
    a.getDate()=== b.getDate()
}

const a = new Date(2019, 0, 26, 10) // 26 Jan 2019, 10am
const b = new Date(2019, 0, 26, 12) // 26 Jan 2019, 12pm
console.log(isSameDay(a, b)) // true

從另一個日期獲取日期

有兩種可能的情況,希望從另一個日期獲得一個日期。

設(shè)置另一個日期特定的日期/時間值

從另一個日期添加/減去增量

設(shè)置另一個日期特定的日期/時間值

可以使用以下方法設(shè)置另一個日期的日期/時間:

setFullYear: 設(shè)置年份

setMonth:設(shè)置月份

setDate:設(shè)置每月的某一天

setHours:設(shè)置時

setNubytes:設(shè)置分

setSeconds:設(shè)置秒

setMilliseconds:設(shè)置毫秒

例如,如果想將日期設(shè)置為每月15日,可以使用setDate(15)

const d = new Date(2019, 0, 10)
d.setDate(15)

console.log(d) // 15 January 2019
注意:上面的setter方法會改變原始日期對象。 在實際中,我們不應(yīng)該改變對象,應(yīng)該在新的日期對象上執(zhí)行這些操作。
const d = new Date(2019, 0, 10)
const newDate = new Date(d)
newDate.setMonth(5)

console.log(d) // 10 January 2019
console.log(newDate) // 10 June 2019

從另一個日期添加/減去增量

添加/減去增量有兩種通用方法。 第一種方法在Stack Overflow上更受歡迎,它簡潔,但更難掌握。 第二種方法更冗長,但更容易理解。

假設(shè)希望獲得從今天起三天的日期。 對于這個例子,假設(shè)今天是2019年3月28日

第一種方法
const today = new Date(2019, 2, 28)

首先,我們創(chuàng)建一個新的Date對象,這樣就不會改變原始日期

const finalDate = new Date(today)

接下來,我們需要知道要更改的值。因為我們要改變?nèi)掌冢晕覀兛梢杂?b>getDate獲得日期

const currentDate = today.getDate()

因為獲取三天后的日期,所以需要在得到的日期加3

setDate(currentDate + 3)

完整代碼:

const today = new Date(2019, 2, 28)
const finalDate = new Date(today)
finalDate.setDate(today.getDate() + 3)

console.log(finalDate) // 31 March 2019
第二種方法

使用getFullYeargetMonthgetDate方法,更改對應(yīng)的值, 然后,我們使用new Date創(chuàng)建最終日期。

const today = new Date(2019, 2, 28)

// Getting required values
const year = today.getFullYear()
const month = today.getMonh()
const day = today.getDate()

// Creating a new Date (with the delta)
const finalDate = new Date(year, month, day + 3)

console.log(finalDate) // 31 March 2019
自動日期校正

如果為Date提供一個超出其可接受范圍的值,JS 將自動重新計算日期。

如下所示,假設(shè)我們把日期定在2019年3月33日,日歷上沒有33日,JS 會自動將3月33日調(diào)整為4月2日

這意味著在創(chuàng)建增量時無需擔心計算分鐘,小時,天,月等,JavaScript會自動處理。

代碼部署后可能存在的BUG沒法實時知道,事后為了解決這些BUG,花了大量的時間進行l(wèi)og 調(diào)試,這邊順便給大家推薦一個好用的BUG監(jiān)控工具 Fundebug。

交流

干貨系列文章匯總?cè)缦拢X得不錯點個Star,歡迎 加群 互相學習。

https://github.com/qq44924588...

我是小智,公眾號「大遷世界」作者,對前端技術(shù)保持學習愛好者。我會經(jīng)常分享自己所學所看的干貨,在進階的路上,共勉!

關(guān)注公眾號,后臺回復福利,即可看到福利,你懂的。

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/105012.html

相關(guān)文章

  • Promise初級與進階---都在這了

    摘要:處理和前一個回調(diào)函數(shù)運行時發(fā)生的錯誤發(fā)生錯誤對象的錯誤具有冒泡性質(zhì),會一直向后傳遞,直到被捕獲為止。 0 前言 我一直以為我對Promise比較了解,相關(guān)的方法已經(jīng)非常熟悉了,直到我看到這篇文章,里面提出了這樣一個問題:Q: 假定 doSomething() 和 doSomethingElse() 均返回 promises,下面的四種 promises 的區(qū)別是什么 /...

    Ocean 評論0 收藏0
  • 你要 React 面試知識點,都在這了

    摘要:是流行的框架之一,在年及以后將會更加流行。于年首次發(fā)布,多年來廣受歡迎。下面是另一個名為的高階函數(shù)示例,該函數(shù)接受另外兩個函數(shù),分別是和。將所有較小的函數(shù)組合成更大的函數(shù),最終,得到一個應(yīng)用程序,這稱為組合。 React是流行的javascript框架之一,在2019年及以后將會更加流行。React于2013年首次發(fā)布,多年來廣受歡迎。它是一個聲明性的、基于組件的、用于構(gòu)建用戶界面的高...

    klinson 評論0 收藏0
  • 如何寫好一個vue組件,老夫一年經(jīng)驗全在這了

    摘要:比如很好用的拖拽庫控制元素是否被拖動的行為。僅僅負責引入以及個人喜好把一個元素當做不可見的包裹元素,并在上面使用。你有什么寫組件的獨特技巧,不妨在評論區(qū)告訴我吧 一個適用性良好的組件,一種是可配置項很多,另一種就是容易覆寫,從而擴展功能 Vue 組件的 API 來自三部分——prop、事件和插槽: prop 允許外部環(huán)境傳遞數(shù)據(jù)給組件 event 允許從組件內(nèi)觸發(fā)外部環(huán)境的副作用 slo...

    187J3X1 評論0 收藏0
  • Python對比兩種日期兩種方式詳細說明

      大家應(yīng)用Python解決日期/時長時,經(jīng)常遇到這樣那樣的問題。文中給大家歸納了兩種Python對比兩種日期方式,所需要的可以了解一下。  以前我們曾介紹過:Python獲得某個時間是周幾的6種方式!事實上,在咱們應(yīng)用Python解決日期/時長時,經(jīng)常遇到這樣那樣的問題。下面我們就來討論另外難題,怎樣用Python對比兩種日期?  datetime  如果需要用Python處理日期和時間,大家肯...

    89542767 評論0 收藏0

發(fā)表評論

0條評論

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