JS日期格式化--使用正則


//采用正則格式化日期
function dateFormat(fmt, date) {
    let ret;
    let opt = {
        "Y+": date.getFullYear().toString(),        //
        "m+": (date.getMonth() + 1).toString(),     //
        "d+": date.getDate().toString(),            //
        "H+": date.getHours().toString(),           //
        "M+": date.getMinutes().toString(),         //
        "S+": date.getSeconds().toString()          //
        // 有其他格式化字符需求可以繼續添加,必須轉化成字符串
    };
    for (let k in opt) {

      let reg = new RegExp("(" + k + ")");
      ret = reg.exec(fmt);
      console.log(reg);
      console.log(ret);

      if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
            };
        };
    return fmt;
}

這個原理是先構建一個對象,保存正則需要的表達式的內容,如Y+,m+等等,Y表示的是年份,所以對應的value是年份,以此類推其他月、天等。

然后利用for in循環遍歷對象,利用key生成正則對象,比如 opt對象的 “S+”這個屬性的key,構造出的正則表達式/(S+)/,如下圖:

 

 

之后使用exec方法去匹配傳的格式字符串,exec()方法匹配成功,返回一個數組對象,如下圖:

 

 

 

返回結果包含了在 格式化字符串內 匹配到的字符串“SS”,input就是格式化符串,通過不斷的replace,將這個字符串內匹配的字符替換。

其實原理就是在原來格式字符串基礎上,匹配到表示年份、月份、天等的字符串,使用日期的年、月、日去替換。

exec()方法匹配不成功返回null。

采用test方法時,匹配成功返回的是true,失敗返回false。

RegExp 

無論采用哪種方式都可以使用RegExp對象,

 

 

 如果成功RegExp.$1返回匹配到的字符串,比如/(m+)/匹配到mm。$0 $2都會返回"",空字符串。

 

 

 padStart

padStart(len,str) :該方法用於補全字符串

len:補全長度

str:補充的字符串,使用這個字符串補充。

fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))

解釋:

fmt: yyyy-mm-dd HH:MM:SS

ret:每一次匹配的結果,比如匹配到mm,ret[1] = mm,ret[1].length = 2,表示日期格式月份的長度應該是2,此時

(ret[1].length == 1) ?不成立,執行
opt[k].padStart(ret[1].length, "0")),
opt[k]是月份值,如果月份長度不是月份格式長度,表示此時月份小於10,要對月份數據用 0 進行補全,否則不用補全。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM