zoukankan      html  css  js  c++  java
  • js正则格式化日期时间自动补0

    原文 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. 单词边界:

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

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

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

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

    代码:

    // 使用$&匹配
    function formatDate(str) {
      /*  
            replace第一个参数正则
    
            (?<=/|-|.|:|)d{1}  用的是后顾,查找 / 或者 - 或者 . 或者 : 或者 单词边界 或者 T 后面的一个数字
    
            d{1}(?=/|-|.|:|)   用的是前瞻,查找 / 或者 - 或者 . 或者 : 或者 单词边界  或者 T 前面的一个数字
    
            replace 第二个参数"0$&" 匹配到的字符串前置补0
    
        */
      return str.replace(/(?<=/|-|.|:||T)d{1}(?=/|-|.|:||T)/g, "0$&");
    }
    
    // 使用$1匹配
    function formatDate(str) {
      /*
            replace第一个参数正则和上面的一样
            
            replace 第二个参数是一个函数,第一个入参就是匹配到的第一个参数,可以在函数内处理补0
        */
      return str.replace(
        /(?<=/|-|.|:||T)d{1}(?=/|-|.|:||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

    更多学习笔记欢迎访问:DuShuSir.com
  • 相关阅读:
    博客地址
    Version 1.4.2_03 of the JVM not suitable for this product.解决
    http请求(一) 工具
    Service 的两种启动方法和区别
    软件开发过程应该采用集中优势兵力各个击破
    架构感悟
    嵌套事务模版
    软件行业对人才的依赖
    使用SQL Server 2005 新的语法ROW_NUMBER()进行分页的两种不同方式的性能比较
    架构设计中的分层与分区
  • 原文地址:https://www.cnblogs.com/DuShuSir/p/15404798.html
Copyright © 2011-2022 走看看