在寫(xiě)接口的時(shí)候遇到一個(gè)這樣的問(wèn)題舌厨,我調(diào)用的 MAPI 接口返回給我一個(gè)這樣的時(shí)間格式:
"/Date(1546012800000+0800)/",而我需要把它轉(zhuǎn)化成這種格式:2019-05-23 12:34:22(北京時(shí)間)颤陶,并作為入?yún)鹘o另一個(gè) MAPI 接口挣郭。
第一時(shí)間想到的解決辦法就是看看框架中是否帶有這種時(shí)間戳處理的功能蛔琅,發(fā) 現(xiàn)大多是直接處理時(shí)間戳的,像這種:1554362965奈辰,所以需要把得到的時(shí)間格 式進(jìn)行處理一下:
首先括號(hào)及括號(hào)兩邊的字符是不需要的,另外乱豆,+0800 是時(shí)區(qū)差奖恰,表示北京時(shí) 間,所以+0800 也可以不需要宛裕。要取出 1546012800000 至少有兩種方式瑟啃,第一 種就是正則表達(dá)式,第二種就是字符串截取函數(shù) slice()揩尸、substring()蛹屿、substr()。
首先說(shuō)正則表達(dá)式岩榆,因?yàn)楦袷绞遣蛔兊拇砀海覀兙椭灰プ∷牟蛔凕c(diǎn)和變點(diǎn),這個(gè)時(shí)間格式中勇边,只有 1546012800000 是變的犹撒,所以第一個(gè)可用的正則表達(dá)式 可以這樣寫(xiě):
解釋一下這個(gè)正則表達(dá)式:
第一個(gè)字符“/”是正則表達(dá)式的開(kāi)始,第二個(gè)字符“\”是轉(zhuǎn)義符粒褒,因?yàn)樽址袔?有“/”识颊,屬于元字符,所以我們需要用轉(zhuǎn)義符轉(zhuǎn)義一下奕坟,/Date 是字符串中的內(nèi) 容祥款,因?yàn)楦袷讲蛔儯@個(gè)地方可以直接匹配月杉。然后又出現(xiàn)了“\”刃跛,因?yàn)楹竺娴?br>
“ (”也是屬于元字符,因此我們還是需要“\”轉(zhuǎn)義符苛萎,之后的( ) 就是分組奠伪,\d 表 示數(shù)字,*表示數(shù)字在文本中出現(xiàn)零次或連續(xù)多次首懈,+號(hào)表示以+號(hào)結(jié)尾绊率,最后 以“/”結(jié)束整個(gè)正則表達(dá)式。
match() 方法可在字符串內(nèi)檢索指定的值究履,或找到一個(gè)或多個(gè)正則表達(dá)式的匹 配滤否,返回指定的值,存放匹配結(jié)果的數(shù)組最仑。
這個(gè)方法很大程度上有賴(lài)于你所寫(xiě) 的正則表達(dá)式是否包含 g藐俺,如果沒(méi)有 g炊甲,那么 match() 方法就只能在 str 中執(zhí)行 一次匹配。如果沒(méi)有找到任何匹配的文本欲芹,match() 將返回 null卿啡。否則,它將 返回一個(gè)數(shù)組菱父,其中存放了與它找到的匹配文本有關(guān)的信息颈娜。該數(shù)組的第 0 個(gè) 元素存放的是匹配文本,而其余的元素存放的是與正則表達(dá)式的子表達(dá)式匹配 的文本浙宜。除了這些常規(guī)的數(shù)組元素之外官辽,返回的數(shù)組還含有兩個(gè)對(duì)象屬性。 index 屬性聲明的是匹配文本的起始字符在 str 中的位置粟瞬,input 屬性存放的是 你要匹配的文本同仆。如果有 g,則 match() 方法會(huì)全局檢索裙品,找到 str 中所有匹配 的子字符串俗批,全局匹配到子串時(shí)返回的數(shù)組中沒(méi)有 index 屬性或 input 屬性。 上面的正則表達(dá)式還可以這樣寫(xiě)市怎,結(jié)果也是一樣的扶镀。
直接從 Date 開(kāi)始匹配,正則表達(dá)式就更簡(jiǎn)短了焰轻。
上面提到寫(xiě)正則表達(dá)式就是要抓住文本中的不變點(diǎn)和變點(diǎn)臭觉,所以它抓住的不變 點(diǎn)在: /Date( 和 +,而如果不變點(diǎn)在這里: ( 和 +辱志,那么我們的正則表達(dá) 式就應(yīng)該這么寫(xiě)了:
對(duì)于上面這個(gè)正則蝠筑,其他的不用多解釋?zhuān)琝w 和+號(hào)可以說(shuō)一說(shuō)。
\w 用來(lái)匹配字母揩懒、數(shù)字和下劃線什乙,而后面的+號(hào)表示在文本中連續(xù)出現(xiàn)一次或 多次。這個(gè)正則中的第三個(gè)+號(hào)是文本中的+號(hào)已球,由于+號(hào)是元字符臣镣,所以我們 需要用“\”進(jìn)行轉(zhuǎn)義一下。 另外再說(shuō)一個(gè)分組的問(wèn)題智亮,如果上面的字符串我們要把+0800 也匹配進(jìn)來(lái)忆某,可 以在正則表達(dá)式中多加一對(duì)括號(hào),像下面這樣:
第一個(gè)正則表達(dá)式我們只匹配到了 1546012800000阔蛉,因?yàn)樗荒茏R(shí)別 /Date(xxx弃舒,上面這個(gè)正則表達(dá)式還可以識(shí)別/Dyzc(,例如:
簡(jiǎn)單說(shuō)一下元字符:
元字符:有特殊含義,以至于不能表示原本意義的字符聋呢。 除了正則表達(dá)式苗踪,HTML、XML削锰、URL通铲,到處都有元字符,并且他們的元字符 還不一定一樣器贩。
HTML:
空格( )不表示空格颅夺, 只能用 ? 來(lái)表示空格。
大于號(hào)(>)不能表示大于號(hào)磨澡,只能用 < 來(lái)表示大于號(hào)
URL 中碗啄,例如:https://www.baidu.com/?search=x%20y
這個(gè) URL 中的%20 其實(shí)是個(gè)空格质和。 因?yàn)?URL 規(guī)定里面只能包含很少的幾十種 字符稳摄,其中空格就是被禁用的,不能包含空格饲宿,那不能包含空格而用戶的確需 要表示空格厦酬,怎么辦呢?
用另外的東西代表空格,在 URL 中瘫想,就是%20
因此
https://www.baidu.com/?search=x%20y
等于
https://www.baidu.com/?search=x y
但是下面這個(gè) url 是不合法仗阅,所以要被「轉(zhuǎn)義」為上面這個(gè)。
url 或者 cookie 中一般一大堆%數(shù)字 1国夜、%數(shù)字 2 的减噪,全是%開(kāi)頭的,這都是套 路车吹。
正則表達(dá)式中可以用/來(lái)把元字符轉(zhuǎn)義成他本來(lái)的意思筹裕,
/ => / ( => ( + => +
HTML 中是以為&開(kāi)頭,;結(jié)尾的窄驹。
URL 中是以%開(kāi)頭朝卒。
正則表達(dá)式是以/開(kāi)頭,/結(jié)尾的乐埠。
不同的語(yǔ)言有不同的規(guī)定抗斤,因?yàn)樵O(shè)計(jì)他們時(shí),可用字符是不一樣的丈咐。
終于說(shuō)完了正則表達(dá)式瑞眼,下面來(lái)說(shuō)說(shuō)第二種獲取"/Date(1546012800000+0800)/" 中 1546012800000 的方法,個(gè)人覺(jué)得用字符串截取函數(shù)來(lái)獲取也同樣是要抓住
不變點(diǎn)和變點(diǎn)棵逊,只有抓住這兩個(gè)负拟,就很好解決這個(gè)問(wèn)題了。因?yàn)榉祷氐臅r(shí)間格 式是固定的歹河,所以我們可以從/開(kāi)始數(shù)掩浙,第 6 個(gè)(index=6)開(kāi)始花吟,然后以+號(hào)結(jié) 束,拿到的剛好是 1546012800000厨姚,下面我借助一下 indexOf 來(lái)獲取到+號(hào)的位置:
indexOf() 方法可返回某個(gè)指定的字符串值在字符串中首次出現(xiàn)的位置衅澈。第一個(gè) 參數(shù)是必須的,就是要檢索的字符串值谬墙,它還可以傳入第二個(gè)參數(shù)今布,必須是個(gè) 整數(shù),從 0 開(kāi)始拭抬,表示從字符串中開(kāi)始檢索的位置部默,比如說(shuō)你想從第 6 個(gè)字符 開(kāi)始檢索,就可以傳 5造虎,最大的取值就是 str.length-1傅蹂。如果省略就是從首字符開(kāi) 始檢索。
再說(shuō)一下 substr()函數(shù): substr()方法返回從指定位置開(kāi)始的字符串中指定字符數(shù)的字符算凿,第一個(gè)參數(shù)是 指定開(kāi)始的位置份蝴,第二個(gè)參數(shù)是截取的長(zhǎng)度。 這里的第二個(gè)參數(shù)長(zhǎng)度就是用+號(hào)的位置減去前面不需要的 6 個(gè)字符氓轰,得到的就 是我們真正要的時(shí)間戳婚夫。
而 slice()、substring()就更更簡(jiǎn)單了了署鸡。
slice()和 substring()方法都是返回一個(gè)索引和另一個(gè)索引之間的字符串案糙。所以這 里只需要傳+號(hào)的位置就行,而且這兩個(gè)文法第二個(gè)參數(shù)都不包含該索引位置的
字符靴庆。具體可以參考下面這篇文章时捌。
https://juejin.im/post/59e2af3151882578cf573319
拿到時(shí)間戳之后就可以直接用框架中的工具,把 1558281600000 轉(zhuǎn)換成 2019-5- 20 0:0:0撒穷。