主頁 > 企業開發 > 記錄-new Date() 我忍你很久了!

記錄-new Date() 我忍你很久了!

2023-04-20 08:17:47 企業開發

這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑,造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考

可惡的四宗罪

1. Safari瀏覽器不兼容YYYY-MM-DD這樣的格式

new Date('2023-1-1');

這行代碼無論在Macbook中還是iPhone中的Safari瀏覽器,回傳的都是Invalid Date, Safari瀏覽器目前還理解不了YYYY-MM-DD這樣的格式,只支持YYYY/MM/DD,這就造成你在Windows環境下的代碼正常原型,而你的其他部分用戶例外顯示;

2、月份的索引是以0為起點的,而年份、日期卻不是

new Date(2023,1,1);

得到的是一個反直覺的結果:2023年2月1日!!!

Wed Feb 01 2023 00:00:00 GMT+0800 (中國標準時間)

同樣的,對應的方法.setMonth()也是從0開始設定的,就……很無語!

3、年份小于100,默認以19xx或20xx開頭

一般的應用可能碰不到這樣的情況,畢竟現在是21世紀了,我們在應用中看到的大部分時間都是現代的,但是當你需要格式化公元元年-公元100年之間的時間,你就該懵了!

舉個栗子:

new Date(2023,1,1);

能正常回傳時間物件

Wed Feb 01 2023 00:00:00 GMT+0800 (中國標準時間)

但是當年份調到了東漢時期,公元50年2月1日

new Date(50,2,1);

恭喜你,你直接迎接了新中國!見證了歷史:

Wed Mar 01 1950 00:00:00 GMT+0800 (中國標準時間)

是的,Date直接幫你加了1900年的時間!如果需要獲得公元50年2月1日,得這么寫

new Date('0050-02-01');

回傳:

Tue Feb 01 0050 08:05:43 GMT+0805 (中國標準時間)

請千萬不要嘗試添加時間,因為你又要裂開了……

new Date('0050-02-01 00:00:00');

回傳:

Wed Feb 01 1950 00:00:00 GMT+0800 (中國標準時間)

你就說,它任性吧?!別氣餒,別忘了標題還有20xx的情況

new Date('10-11-12');

回傳:

Thu Oct 11 2012 00:00:00 GMT+0800 (中國標準時間)

就是說,當年份為2位數的時候,這種字串格式的,建構式把最后面那個當作年份,而且默認它為20xx年

4、日期初始化不統一,存在時區差異

你相信嗎?'2018-01-01'和'2018/01/01'是不同的,存在一定時差

new Date('2018-01-01');

回傳:

Mon Jan 01 2018 08:00:00 GMT+0800 (中國標準時間)

然而……

new Date('2018/01/01');

回傳:

Mon Jan 01 2018 00:00:00 GMT+0800 (中國標準時間)

看到差異了嗎?兩種格式回傳的時間是不同的,查了個北京時間與格林尼治時間的時差,8個小時啊!

應用思考

在日常開發中,我們應用new Date()無非就是對時間運算及時間的格式化,

1. 時間的計算

需要方便對比兩個時間的早晚,可以分別對年份、月份、日期、小時等進行單獨比較,而我們現有的操作還比較麻煩,

比如,我想知道2003年7月13日北京申奧成功到2008年8月8日北京奧運開幕中間差了幾天,如何快速計算?這樣的計算在日常開發中還比較常見,特別是電商網站對搶購環節的倒計時,

還有諸如,當前時間在100天以后又是幾月幾號呢?

2. 時間的比較

給定兩個時間,判斷哪個在前,哪個在后;給定一個時間回傳,判斷某個時間是不是在這兩者之間,

3. 時間的格式化

在網站開發中,我們最常見的就是對后臺回傳時間戳的格式化顯示,而原生帶來的僅有年份如何獲取,月份如何獲取,日期如何獲取的方法,就方便的無非就是toISOString()這樣的方法,但是回傳的卻不一定是你要的格式,如何快速實作自定義格式化字串,這也是一門技術,

困境的解決

想必大家日常中也用過 moment.js、dayjs、data-format這些工具吧?確實挺好用的,我也就順便說一下而已,因為我要開始打廣告了……面對著new Date()各種無語的坑,我慢慢的也弄了一個不大的庫(250行左右代碼),

你要說我的庫和前面的幾個庫對比,有啥改進的或者有啥特點的嗎?

??確實也沒有,我只是想用自己造的“輪子”,走自己路,它更符合我自己的使用習慣罷了

【專案開源地址】github.com/mumuy/datex

【專案演示地址】passer-by.com/datex/

提供的方法足以解決以上“四宗罪”及日常應用,它提供多種初始化時間的方式:

實體化物件

// 通過時間戳
datex(123456789);

// 通過多個引數初始化
datex(2018,8,8);

// 通過時間字串初始化
datex('2018-08-08');
datex('2018-04-04T16:00:00.000Z');

// 通過時間物件初始化
datex({year:2008,month:8,day:8,hour:8,minute:0,second:0});

// 通過時間陣列初始化
datex([2018,8,8,8,8,0]);

// 無引數初始化
datex();

時間戳及克隆

// 回傳時間戳(毫秒)
datex().getTime();

// 回傳時間戳(秒)
datex().getUnix();

// 克隆
datex().clone();

時間物件輸出

// 回傳原生Date物件
datex().toDate();

// 回傳時間欄位物件
datex().toObject();

// 回傳時間欄位陣列
datex().toArray();

// 回傳字串
datex().toString();

// 回傳ISO字串
datex().toISOString();

時間格式化

datex(123456789).format('YYYY-MM-DD');

時間計算及比較

// 設定某欄位值
datex(2022,10,1).set('year',2020).format();

// 增減某欄位值,負值為減
datex(2022,10,1).change('year',1).format();

// 回傳某欄位值
datex().get('month');

// 獲取某欄位起始時
// 例如:獲取這個月初是星期幾?
datex().startOf('month').format('W');

// 獲取某欄位末尾時
// 例如:獲取這個月有多少天?(是不是很容易理解?end of month then get day!)
datex().endOf('month').get('day');

// 與某時間點差值
// 例如:北京2008年奧運會開幕式過去多少天了?
datex().diffWith('2008-8-8','day');

// 是否在某個時間點之前
datex('2008-08-08').isBefore('2022-02-02');

// 是否在某個時間點之后
datex('2008-08-08').isAfter('2022-02-02');

// 是否和某個時間點相等
datex('2008-08-08').isSame('2018-02-02','year');

// 是否在兩個時間點之間
datex('2008-08-08').isBetween('2003-07-13','2022-02-02');

有效性

datex('2008-13-12').isValid();

本文轉載于:

https://juejin.cn/post/7221884988492382267

如果對您有所幫助,歡迎您點個關注,我會定時更新技術檔案,大家一起討論學習,一起進步,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/550585.html

標籤:其他

上一篇:使用Vue.js實作文字跑馬燈效果

下一篇:使用Django Rest framework搭建Blog

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more