最近在翻看原來寫的工具函式中,發現了formatdate
這個工具函式,原來只是在使用,具體的實現原理沒有仔細研究過,這次就來分析一下它的實現,了解一下正規表示式的乙個實戰應用。
formatdate
函式接受兩個引數,日期物件和格式引數,可以根據不同的格式引數將事件物件轉換成日期格式,大致使用如下
formatdate(new date(), 'yy-mm-dd') // 18-05-13
formatdate(new date(), 'yyyy-mm-dd hh:mm') // "2018-05-13 16:35"
當然也可以把函式掛載在prototype
上面,這樣就只需要乙個引數了,這個後續再說。
實現思路比較簡單,就是利用,date
提供的函式,比如getmonth
,getfullyear
等函式先把date
物件拆解出必要的部分。年月日小時分鐘秒等,然後再根據傳入的引數進行組合,得到想要的效果。這裡有幾個處理過程中需要注意的地方。
formatdate(new date(), 'yyyy-m-dd') // "2018-5-13"
formatdate(new date(), 'yyyy-mm-dd') // "2018-05-13"
因為需要支援各種組合,所以需要乙個物件將個部分儲存下來,根據引數的格式能夠快速的解析出來對應的值。物件的格式大致如下
var cfg =
雙位補0單位不補0,補0的過程封裝成乙個函式paddnum
,自然想到的是用正規表示式來判斷是否是1位,很容易寫出如下**
let paddnum = num =>
return num
}
不過還可以使用字串提供的正規表示式replace
功能簡化這個過程,使用捕獲組來獲取匹配的值,再+0,如果沒有匹配,就返回本身,這也正是我們想要的,這裡提前需要把數字轉換成字串。
let paddnum = num => num.tostring().replace(/^(\d)$/, '0$1')
這樣每個日期的資料處理部分就做完了。
下面實現日期格式的解析,要把傳入的日期格式做匹配,然後從物件解析出對應的值,再拼到一塊。
分析傳入日期的格式,都是yyyy
,dd
這種重疊的格式,這就需要針對每乙個匹配出來的值,都要匹配到與其相同的一組值,也就是如果匹配到y
,那就要把緊跟在y
後面所有的y
都匹配出來,比如yy
,yyyy
等,直到遇到首個不是y
的字元停止。這就需要在匹配環節記住匹配的部分並重複匹配,捕獲組又派上了用場。/([a-z])(\1)*/
,\1
可以代替匹配到的字元,進而組成新的匹配條件,這樣的匹配條件就是那種想要的重疊格式了。
所以解析的過程如下
format.replace(/([a-z])(\1)*/ig, m => cfg[m])
稍作整理,這個工具函式就組合起來了
const formatdate = (date=new date(), format='yyyy-mm-dd hh:mm:ss') =>
return format.replace(/([a-z])(\1)*/ig, m => cfg[m])
}
可以看出用好正規表示式的捕獲組,可以大大簡化**量,邏輯看上去也很清楚。 正規表示式 日期
1 日期範圍 datetime 值型別表示值範圍在公元 紀元 0001 年 1 月 1 日午夜 12 00 00 到公元 c.e.9999 年 12 月 31 日晚上 11 59 59 之間的日期和時間。2 閏年 關於公曆閏年是這樣規定的 地球繞太陽公轉一周叫做一回歸年,一回歸年長365日5時48分...
日期正規表示式
判斷閏年的規則 1 能被400整除 2 能被4整除不能被100整除 日期正規表示式的構建思想 平年365天,閏年366天,只有在閏年的時候,2月有29天,其餘年份,2月總是只有28天,而其餘月份是的天數是一樣的。那麼,只需要對所有的年份 包括閏年 構建出2月只有28天 其餘月份正常表示 的正規表示式...
正規表示式應用(一)
分類名稱 說明 正規表示式 情侶專屬號 尾數 7位數中,存在 520的情侶專屬號段 520 四連號 尾數 7位中含 4個連續數字全相同 aaaa d 1 福運號 尾數 7位中含兩組 3個連續數字全相同 aaa bbb d 1 d d 3 如意號 尾數 7位數中,存在aabbccc aacccbb c...