首页 > 其他分享 >js正则格式化日期时间自动补0的两种解法 将2022-3-4这种日期格式转化为2022-03-04

js正则格式化日期时间自动补0的两种解法 将2022-3-4这种日期格式转化为2022-03-04

时间:2023-06-16 12:44:26浏览次数:67  
标签:03 04 replace 日期 2022 formatDate

js正则格式化日期时间自动补0的两种解法 将2022-3-4这种日期格式转化为2022-03-04
https://www.jb51.net/article/225324.htm

+
目录

背景

时间日期格式化的需求很常见,也有很多工具类转换方法,比如需要将2022-3-4这种日期格式转化为2022-03-04,也就是实现个位数月份或天数日期自动前置补 0。用moment.js、dayjs第三方库的 API 也很容易做到,这里我们自己实现一下看看。

解法一

思路:

先来看看常规方案。就用这个2022-3-4日期来举例子,我们先根据-切分字符串,得到一个数组,然后分别识别3、4这种个位数日期,<10就前置补 0,否则不操作。

代码:

?
12345678910111213141516171819function formatDate(str) {  // 根据 - 符号拆分  return str    .split("-")    .map((item) => {      // +item 将item字符串转换为数字      // 小于10的时候就补全一个前缀0      if (+item < 10) {        return "0" + +item;      }       // 大于10的时候不用补0      return item;    })    .join("-"); // 最后重组回来} // 测试formatDate("2022-03-4"); // 输出 '2022-03-04'

上面这个方案,只适配了2022-3-4转2022-03-04这种简单的转换,更复杂的日期格式或者日期时间格式,比如2022-3-4 1:2:3还不能匹配到。 而且,我们这里只识别了-这一种格式,假如还有2022/3/4、2022.3.4这种写法呢?

解法二

思路:

再来看看用正则表达式,用正则表达式不仅可以简化代码,还能更容易的兼容更多情况。

我们的核心思路是用前瞻后顾来识别日期连接符号中间的数字,然后判断数字是否需要补全 0。写之前,先来熟悉几个正则表达式的用法。

1、前瞻:(?=),后顾:(?<=),

简单来理解,就是

?
1234567891011// 前瞻:A(?=B)   //查找B前面的A // 后顾:(?<=B)A   //查找B后面的A // 负前瞻:A(?!B)   //查找后面不是B的A // 负后顾:(?<!B)A   //查找前面不是B的A

我们这里可以用来识别-、/、.等字符之间的数字

2、单词边界:\b

  • 单词指的是\w可以匹配的字符,即数字、大小写字母以及下划线 [0-9a-zA-Z_]
  • 边界 指的是占位的字符左右的间隙位置

我们这里可以用于识别-到日期开始或结束位置的数字,比如2022-3-4 1:2:5中,4后面的间隙,1前面的间隙,5后面的间隙,都是单词边界

3、replace方法替换匹配的字符串:$&。

匹配到个位数数字之后,还要补 0,$&就是代表匹配到的数字,用0$&就可以实现补 0。

代码:

?
1234567891011121314151617181920212223242526272829303132333435// 使用$&匹配function formatDate(str) {  /*          replace第一个参数正则         (?<=\/|-|\.|:|\b)\d{1}  用的是后顾,查找 / 或者 - 或者 . 或者 : 或者 单词边界 或者 T 后面的一个数字         \d{1}(?=\/|-|\.|:|\b)   用的是前瞻,查找 / 或者 - 或者 . 或者 : 或者 单词边界  或者 T 前面的一个数字         replace 第二个参数"0$&" 匹配到的字符串前置补0     */  return str.replace(/(?<=\/|-|\.|:|\b|T)\d{1}(?=\/|-|\.|:|\b|T)/g, "0$&");} // 使用$1匹配function formatDate(str) {  /*        replace第一个参数正则和上面的一样                 replace 第二个参数是一个函数,第一个入参就是匹配到的第一个参数,可以在函数内处理补0    */  return str.replace(    /(?<=\/|-|\.|:|\b|T)\d{1}(?=\/|-|\.|:|\b|T)/g,    function ($1) {      return "0" + $1;    }  );} // 测试formatDate("2022-3-4 1:2:3"); // 输出 '2022-03-04 01:02:03'formatDate("2022/3/4"); // 输出 '2022/03/04'formatDate("2022.3.4"); // 输出 '2022.03.04'formatDate("2020/8/9T1:2:3"); // 输出 '2020/08/09T01:02:03'

总结

我们这里只是做了普通字符串的转换,也有些缺点

  1. 日期校验没有内置
  2. 类似01/10/07这种简写的日期格式也没有考虑在内

感兴趣的朋友可以发挥下,丰富下我们的转换方法。

参考

标签:03,04,replace,日期,2022,formatDate
From: https://www.cnblogs.com/sunny3158/p/17485270.html

相关文章

  • 2022年 12 月 Tita 升级|管理员权限全新升级!
    升级快速一览:·【管理员授权】全新的「权限组」授权模式,支持定制更复杂的管理角色·【系统影响】精准定位管理范围与权限,满足企业管理需求点击免费领取绩效考核模版等资料升级详情一、管理员授权页面升级,全新的「权限组」授权模式,支持企业灵活自定的管理角色界面改动......
  • 【专题】2022-2023中国跨境出口B2C电商报告PDF合集分享(附原数据表)
    报告链接:http://tecdat.cn/?p=32805原文出处:拓端数据部落公众号全球疫情的爆发对于全球经济和消费市场都带来了很大的冲击,特别是在消费者的消费行为和零售市场格局方面发生了重大变革。同时由于全球供应链的重新调整,产业分化现象也加速出现。中国跨境电商已经历了十年以上的发......
  • 国产MCU-CW32F030开发学习--按键检测
    国产MCU-CW32F030开发学习--按键检测bsp_key按键驱动程序用于扫描独立按键,具有软件滤波机制,采用FIFO机制保存键值。可以检测如下事件:按键按下。按键弹起。长按键。长按时自动连发。我们将按键驱动分为两个部分来介绍,一部分是FIFO的实现,一部分是按键检测的实现......
  • LHY2022-HW02-Speech Recognition
    1.实验结果纪录  纪录一下调整参数带来的结果.不过语音识别这块完全不熟.1.1SimpleBaselineacc>0.45797  直接上传助教代码1.2MiddleBaselineacc>0.69747  助教给与了提示需要我们将frame拼接,可以达到更好的训练效果.进行了几轮尝试(1)拼接11维frame,将3......
  • TesorFlow03-TesorFlow的基础
    1TesorFlow的数据结构list:[1,1.2,'Hello',(1,2)],这个list里面什么都可以存储,但是如果存储一个图片[64,32,32,3]里面全是数字的话,大小会很大,所以引入np.arraynp.array:可以很方便的做一些同类型的数据的运算,比如加、减、乘、除、转置。但是有一个致命的弱点,就是np是在深度......
  • fatal: unable to access 'https://github.com/JiangYuLab/CNVcaller.git/': TCP conn
     001、gitclone报错 002、解决方法进入github官网,搜索该项目 003、上传至linux、解压[root@PC1test2]#unzipCNVcaller-master.zip ......
  • [ZJOI2022] 深搜 题解
    题目描述九条可怜是一个喜欢算法的女孩子,在众多算法中她尤其喜欢深度优先搜索(DFS)。有一天,可怜得到了一棵有根树,树根为\(\mathit{root}\),树上每个节点\(x\)有一个权值\(a_x\)。在一棵树上从\(x\)出发,寻找\(y\)节点,如果使用深度优先搜索,则可描述为以下演算过程:将递归栈......
  • Java 字符串转日期 str 转为 Date 类型 Date date = new SimpleDateFormat("yyyy-MM-
    Java字符串转日期str转为Date类型Datedate=newSimpleDateFormat("yyyy-MM-dd").parse("2022-12-28");https://blog.csdn.net/weixin_35756690/article/details/129059668在Java中,可以使用SimpleDateFormat类将字符串转换为日期。首先,需要创建一个SimpleDateFor......
  • IP段是什么意思?杭州高防服务器103.219.30.X
    IP段就是网段,一般指一个计算机网络中使用同一物理层设备(传输介质,中继器,集线器等)能够直接通讯的那一部分。例如,从103.219.30.1到103.219.30.255这之间就是一个网段。在同一网段,要求网络标识相同。网络标识就是用IP的二进制与子网掩码的二进制数据作'与'运算(可用WINDOWS计算器算二进......
  • ASEMI代理光宝光耦LTV-0314的应用与优势
    编辑-Z在电子设备的设计和制造过程中,光耦合器是一种至关重要的组件。它们在电路中起到隔离作用,保护电子设备免受电压冲击和电流过载的影响。今天,我们将深入探讨一种特殊的光耦合器——LTV-0314,它的特性、应用以及优势。 一、LTV-0314的特性 LTV-0314是一种高性能的光耦合器......