原文 js正则格式化日期时间自动补0

背景

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

解法一

思路:

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

代码:

function 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-42022-03-04这种简单的转换,更复杂的日期格式或者日期时间格式,比如2022-3-4 1:2:3还不能匹配到。

而且,我们这里只识别了-这一种格式,假如还有2022/3/42022.3.4这种写法呢?

解法二

思路:

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

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

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

    简单来理解,就是

    // 前瞻:
    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。

代码:

// 使用$&匹配
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这种简写的日期格式也没有考虑在内

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

参考

原文来自 https://lwebapp.com

更多程序员工具箱:https://lwebapp.com/zh/tools

js正则格式化日期时间自动补0的更多相关文章

  1. JS时间戳格式化日期时间

    由于mysql数据库里面存储时间存的是时间戳,取出来之后,JS要格式化一下显示.(李昌辉) 用的次数比较多,所以写了一个简单方法来转换: //时间戳转时间 function RiQi(sj) { va ...

  2. JS时间戳格式化日期时间 由于mysql数据库里面存储时间存的是时间戳,取出来之后,JS要格式化一下显示。

    //时间戳转时间 function RiQi(sj) { var now = new Date(sj*1000); var year=now.getFullYear(); var month=now. ...

  3. Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例

    Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...

  4. Java数字格式化输出时前面补0

    Java数字格式化输出时前面补0 星期日 2014年11月30日|  分类: Java     /** * 里数字转字符串前面自动补0的实现. * */ public class TestString ...

  5. 格式化日期时间字符串 Get-Date -Uformat , -format

    #将字符串格式化为时间格式 $dateTimeStr = '20141231T23:59:59' $format = 'yyyyMMddTHH:mm:ss' $formatProvider = [Gl ...

  6. IOS开发之格式化日期时间

    IOS开发之格式化日期时间(转)   在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理. 例如: //实例化一个NSDateFor ...

  7. input内强制保留小数点后两位 位数不足时自动补0

    input内强制保留小数点后两位 位数不足时自动补0 小数点后位数超出2位时进行四舍五入 需引入jquery包 1.11.2版本 1 function xiaoshu(x) 2 { 3 var f = ...

  8. T-SQL使用案例——结果数据前面自动补0

    原文:T-SQL使用案例--结果数据前面自动补0 现象: 在开发的过程中,往往需要数字和字符串互转.在转换的过程中,可能需要把1编程00001,这样的格式.实现这种样子是有非常多的方法,本文主要提供一 ...

  9. java数字转字符串前面自动补0或者其他数字

    /**  * Java里数字转字符串前面自动补0的实现.  *  * @author  xiaomo *  */  public class TestStringFormat {    public ...

随机推荐

  1. 小程序生成商品分享二维码海报解决方案和实现方式JAVA

    使用技术:  Graphics , 七牛云 , 微信sdk(github上非常出名的wxjava,地址https://github.com/Wechat-Group/WxJava/)直接上干货代码,每 ...

  2. 关闭 Scroll Lock

    通常,在电子表格中选择一个单元格并按箭头键时,所选内容会在各个单元格之间上下左右移动,具体取决于您按的箭头键.但是,如果在 Scroll Lock 处于开启状态时按箭头键,则向上或向下滚动一行.或者, ...

  3. 本地yum源搭建

    2021/07/15 1.挂载 # 创建挂载目录 mkdir /mnt/cdrom # 挂载 mount -t iso9660 /dev/cdrom /mnt/cdrom 2.修改 yum 源配置# ...

  4. C++之常指针,指针常量,函数指针,const用法总结

    1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...

  5. Mybatis(三)——全局配置文件

    二.properties     三.settings 四.typeAilases 这里不做介绍.

  6. Redis的配置文件redis.conf的解析

    1.redis的配置文件为redis.conf 2.redis配置文件redis.conf中关于网络的配置 3.redis配置文件redis.conf中的日志配置 4.redis配置文件redis.c ...

  7. tar 命令简介

    tar命令可以为linux的文件和目录创建档案.利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件.tar最初被用来在磁带上创建档案,现在,用户可以在 ...

  8. 搭建GIT仓库

  9. 【PHP数据结构】其它排序:简单选择、桶排序

    这是我们算法正式文章系列的最后一篇文章了,关于排序的知识我们学习了很多,包括常见的冒泡和快排,也学习过了不太常见的简单插入和希尔排序.既然今天这是最后一篇文章,也是排序相关的最后一篇,那我们就来轻松一 ...

  10. 织梦 arclist调用副栏目内容解决办法

    1 打开include/taglib/arclist.lib.php,找到296行: if($CrossID=='') $orwheres[] = ' arc.typeid IN ('.GetSonI ...