时间格式转换、JS工具函数(数字、时间转换、正则校验、获取url参数)

这篇博客分享了一系列JavaScript实用工具函数,包括数字操作(如生成随机数、千分位分隔)、数字格式转化(如大写金额、中文数字)、格式校验(如身份证、邮箱、手机号的验证)、时间格式转换以及URL操作。还提供了设备判断(如移动设备、苹果/安卓设备检测)和时间操作(如当前时间、时间格式化、时间间隔计算)。这些函数对于前端开发非常有用。
摘要由CSDN通过智能技术生成

时间格式转换、JS工具函数(数字、时间转换、正则校验、获取url参数)

  1. 数字操作
    (1)生成指定范围随机数
export const randomNum = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;

(2)数字千分位分隔

export const format = (n) => {
    let num = n.toString();
    let len = num.length;
    if (len <= 3) {
        return num;
    } else {
        let temp = '';
        let remainder = len % 3;
        if (remainder > 0) { // 不是3的整数倍
            return num.slice(0, remainder) + ',' + num.slice(remainder, len).match(/\d{3}/g).join(',') + temp;
        } else { // 3的整数倍
            return num.slice(0, len).match(/\d{3}/g).join(',') + temp; 
        }
    }
}
  1. 格式转化
    (1)数字转化为大写金额
export const digitUppercase = (n) => {
    const fraction = ['角', '分'];
    const digit = [
        '零', '壹', '贰', '叁', '肆',
        '伍', '陆', '柒', '捌', '玖'
    ];
    const unit = [
        ['元', '万', '亿'],
        ['', '拾', '佰', '仟']
    ];
    n = Math.abs(n);
    let s = '';
    for (let i = 0; i < fraction.length; i++) {
        s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
    }
    s = s || '整';
    n = Math.floor(n);
    for (let i = 0; i < unit[0].length && n > 0; i++) {
        let p = '';
        for (let j = 0; j < unit[1].length && n > 0; j++) {
            p = digit[n % 10] + unit[1][j] + p;
            n = Math.floor(n / 10);
        }
        s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
    }
    return s.replace(/(零.)*零元/, '元')
        .replace(/(零.)+/g, '零')
        .replace(/^整$/, '零元整');
};
(2)数字转化为中文数字
export const intToChinese = (value) => {
 const str = String(value);
 const len = str.length-1;
 const idxs = ['','十','百','千','万','十','百','千','亿','十','百','千','万','十','百','千','亿'];
 const num = ['零','一','二','三','四','五','六','七','八','九'];
 return str.replace(/([1-9]|0+)/g, ( $, $1, idx, full) => {
    let pos = 0;
    if($1[0] !== '0'){
      pos = len-idx;
      if(idx == 0 && $1[0] == 1 && idxs[len-idx] == '十'){
        return idxs[len-idx];
      }
      return num[$1[0]] + idxs[len-idx];
    } else {
      let left = len - idx;
      let right = len - idx + $1.length;
      if(Math.floor(right / 4) - Math.floor(left / 4) > 0){
        pos = left - left % 4;
      }
      if( pos ){
        return idxs[pos] + num[$1[0]];
      } else if( idx + $1.length >= len ){
        return '';
      }else {
        return num[$1[0]]
      }
    }
   });
}
  1. 格式校验
    (1)校验身份证号码
export const checkCardNo = (value) => {
    let reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
    return reg.test(value);
};

(2)校验是否包含中文

export const haveCNChars => (value) => {
    return /[\u4e00-\u9fa5]/.test(value);
}

(3)校验是否为中国大陆的邮政编码

export const isPostCode = (value) => {
    return /^[1-9][0-9]{5}$/.test(value.toString());
}

(4)校验是否为IPv6地址

export const isIPv6 = (str) => {
    return Boolean(str.match(/:/g)?str.match(/:/g).length<=7:false && /::/.test(str)?/^([\da-f]{1,4}(:|::)){1,6}[\da-f]{1,4}$/i.test(str):/^([\da-f]{1,4}:){7}[\da-f]{1,4}$/i.test(str));
}

(5)校验是否为邮箱地址

export const isEmail = (value) {
    return /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(value);
}

(6)校验是否为中国大陆手机号

export const isTel = (value) => {
    return /^1[3,4,5,6,7,8,9][0-9]{9}$/.test(value.toString());
}

(7)校验是否包含emoji表情

export const isEmojiCharacter = (value) => {
   value = String(value);
    for (let i = 0; i < value.length; i++) {
        const hs = value.charCodeAt(i);
        if (0xd800 <= hs && hs <= 0xdbff) {
            if (value.length > 1) {
                const ls = value.charCodeAt(i + 1);
                const uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                if (0x1d000 <= uc && uc <= 0x1f77f) {
                    return true;
                }
            }
        } else if (value.length > 1) {
            const ls = value.charCodeAt(i + 1);
            if (ls == 0x20e3) {
                return true;
            }
        } else {
            if (0x2100 <= hs && hs <= 0x27ff) {
                return true;
            } else if (0x2B05 <= hs && hs <= 0x2b07) {
                return true;
            } else if (0x2934 <= hs && hs <= 0x2935) {
                return true;
            } else if (0x3297 <= hs && hs <= 0x3299) {
                return true;
            } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030
                    || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b
                    || hs == 0x2b50) {
                return true;
            }
        }
    }
   return false;
}

(8)emoji表情转字符

function EmojiExchangeString(str) { 
  var patt=/[\ud800-\udbff][\udc00-\udfff]/g; // 检测utf16字符正则 
  str = str.replace(patt, function(char){ 
      var H, L, code; 
      if (char.length===2) { 
          H = char.charCodeAt(0); // 取出高位 
          L = char.charCodeAt(1); // 取出低位 
          code = (H - 0xD800) * 0x400 + 0x10000 + L - 0xDC00; // 转换算法 
          return "&#" + code + ";"; 
      } else { 
          return char; 
      } 
  }); 
  return str; 
}

(9)字符转表情

function StringExchangeEmoji(str){
  var reg = /\&#.*?;/g;
  var result = str.replace(reg,function(char){
      var H,L,code;
      if(char.length == 9 ){
          code = parseInt(char.match(/[0-9]+/g));
          H = Math.floor((code-0x10000) / 0x400)+0xD800;
          L = (code - 0x10000) % 0x400 + 0xDC00;
          return unescape("%u"+H.toString(16)+"%u"+L.toString(16));
      }else{
          return char;
      }
  });
  return result;
}
  1. 操作URL
    (1)获取URL参数列表
export const GetRequest = () => {
    let url = location.search;
    const paramsStr = /.+\?(.+)$/.exec(url)[1]; // 将 ? 后面的字符串取出来
    const paramsArr = paramsStr.split('&'); // 将字符串以 & 分割后存到数组中
    let paramsObj = {};
    // 将 params 存到对象中
    paramsArr.forEach(param => {
      if (/=/.test(param)) { // 处理有 value 的参数
        let [key, val] = param.split('='); // 分割 key 和 value
        val = decodeURIComponent(val); // 解码
        val = /^\d+$/.test(val) ? parseFloat(val) : val; // 判断是否转为数字
        if (paramsObj.hasOwnProperty(key)) { // 如果对象有 key,则添加一个值
          paramsObj[key] = [].concat(paramsObj[key], val);
        } else { // 如果对象没有这个 key,创建 key 并设置值
          paramsObj[key] = val;
        }
      } else { // 处理没有 value 的参数
        paramsObj[param] = true;
      }
    })
    return paramsObj;
};

(2)键值对拼接成URL参数

export const params2Url = (obj) => {
     let params = []
     for (let key in obj) {
       params.push(`${key}=${obj[key]}`);
     }
     return encodeURIComponent(params.join('&'))
}

(3)修改URL中的参数

export const replaceParamVal => (paramName, replaceWith) {
   const oUrl = location.href.toString();
   const re = eval('/('+ paramName+'=)([^&]*)/gi');
   location.href = oUrl.replace(re,paramName+'='+replaceWith);
   return location.href;
}

(4)删除URL中指定参数

export const funcUrlDel = (name) => {
  const baseUrl = location.origin + location.pathname + "?";
  const query = location.search.substr(1);
  if (query.indexOf(name) > -1) {
    const obj = {};
    const arr = query.split("&");
    for (let i = 0; i < arr.length; i++) {
      arr[i] = arr[i].split("=");
      obj[arr[i][0]] = arr[i][1];
    }
    delete obj[name];
    return baseUrl + JSON.stringify(obj).replace(/[\"\{\}]/g,"").replace(/\:/g,"=").replace(/\,/g,"&");
  }
}
  1. 设备判断
    (1)判断是移动还是PC设备
export const isMobile = () => {
  if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iOS|iPad|Backerry|WebOS|Symbian|Windows Phone|Phone)/i))) {
  return 'mobile';
  }
  return 'desktop';
}

(2)判断是否是苹果还是安卓移动设备

export const isAppleMobileDevice = () => {
  let reg = /iphone|ipod|ipad|Macintosh/i;
  return reg.test(navigator.userAgent.toLowerCase());
}

export const isAndroidMobileDevice = () => {
  return /android/i.test(navigator.userAgent.toLowerCase());
}
  1. 时间操作
    (1)当前时间
export const nowTime = () => {
    const now = new Date();
    const year = now.getFullYear();
    const month = now.getMonth();
    const date = now.getDate() >= 10 ? now.getDate() : ('0' + now.getDate());
    const hour = now.getHours() >= 10 ? now.getHours() : ('0' + now.getHours());
    const miu = now.getMinutes() >= 10 ? now.getMinutes() : ('0' + now.getMinutes());
    const sec = now.getSeconds() >= 10 ? now.getSeconds() : ('0' + now.getSeconds());
    return +year + "年" + (month + 1) + "月" + date + "日 " + hour + ":" + miu + ":" + sec;
}

(2)格式化时间

export const dateFormater = (formater, time) => {
    let date = time ? new Date(time) : new Date(),
        Y = date.getFullYear() + '',
        M = date.getMonth() + 1,
        D = date.getDate(),
        H = date.getHours(),
        m = date.getMinutes(),
        s = date.getSeconds();
    return formater.replace(/YYYY|yyyy/g, Y)
        .replace(/YY|yy/g, Y.substr(2, 2))
        .replace(/MM/g,(M<10 ? '0' : '') + M)
        .replace(/DD/g,(D<10 ? '0' : '') + D)
        .replace(/HH|hh/g,(H<10 ? '0' : '') + H)
        .replace(/mm/g,(m<10 ? '0' : '') + m)
        .replace(/ss/g,(s<10 ? '0' : '') + s)
}
// dateFormater('YYYY-MM-DD HH:mm:ss')
// dateFormater('YYYYMMDDHHmmss')

(3)时间戳转时间(2021/10/25/14:13)

function timeplateToTime(timeplate){
  var time = new Date(timeplate);
  var y = time.getFullYear();
  var m = (time.getMonth()+1)>9?(time.getMonth()+1):'0'+(time.getMonth()+1);
  var d = time.getDate()>9?time.getDate():'0'+time.getDate();
  var h = time.getHours()>9?time.getHours():'0'+time.getHours();
  var mm = time.getMinutes()>9?time.getMinutes():'0'+time.getMinutes();
  return y+'/'+m+'/'+d+'/'+h+':'+mm;
}

(4)时间戳转时间(2021-10-25)

function timeToDate(timeplate){
  var time = new Date(timeplate);
  var y = time.getFullYear();
  var m = (time.getMonth()+1)>9?(time.getMonth()+1):('0'+(time.getMonth()+1));
  var d = time.getDate()>9?time.getDate():'0'+time.getDate();
  return y+'-'+m+'-'+d;
}

(5)获取当前年月(2021.10&2021-10)

function getCurrentYM(){
  var time = new Date();
  var y = time.getFullYear();
  var m = (time.getMonth()+1)>9?(time.getMonth()+1):('0'+(time.getMonth()+1));
  return y+'.'+m;
}

function translateDateParam1(val){
  var d = new Date(val);
  return d.getFullYear() + '-' + (d.getMonth() + 1)
} 

(6)当前时间距离某个时间多少小时分钟(一般用于倒计时的场景)

function timeDestince (timesData) {
  if(timesData){
    
    var dateBegin = new Date(timesData.replace(/-/g, "/"));//将-转化为/,使用new Date
    var dateEnd = new Date();//获取当前时间
    if(dateBegin.getTime()<dateEnd.getTime()){
      return '0分钟'
    }
    var dateDiff = dateBegin.getTime() - dateEnd.getTime();//时间差的毫秒数
    var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000));//计算出相差天数
    var leave1 = dateDiff % (24 * 3600 * 1000)    //计算天数后剩余的毫秒数
    var hours = Math.floor(leave1 / (3600 * 1000))//计算出小时数
    //计算相差分钟数
    var leave2 = leave1 % (3600 * 1000)    //计算小时数后剩余的毫秒数
    var minutes = Math.floor(leave2 / (60 * 1000))//计算相差分钟数
    //计算相差秒数
    var leave3 = leave2 % (60 * 1000)      //计算分钟数后剩余的毫秒数
    var seconds = Math.round(leave3 / 1000);
    var timesString = '';

    if (dayDiff != 0) {
        timesString += dayDiff + '天';
    }
    if ( hours != 0) {
        timesString += hours + '小时';
    }
    if (dayDiff == 0 && hours == 0) {
      if(minutes!=0){
        timesString += minutes + '分钟';
      }else{
        timesString += seconds + '秒';
      }
        
    }
    return timesString
  }else{
    return '0分钟'
  }
}

(7)发布时间与当前时间间隔(一般用于资讯、评论发布时间展示)

function dayHoursMinute(minute){
  let min = parseInt(minute)
  let day = Math.floor(min/(60*24))
  let hours = Math.floor(min%(60*24)/60)
  let m = min%(60*24)%60
  if(day==0){
    if(hours==0){
      return m+'分钟前'
    }else{
      if(m==0){
        return hours+'小时前'
      }else{
        return hours+'小时'+m+'分钟前'
      }
    }
  }else{
    if(hours==0){
      if(m==0){
        return day+'天前'
      }else{
        return day+'天'+m+'分钟前'
      }
    }else{
      if(m==0){
        return day+'天'+hours+'小时前'
      }else{
        return day+'天'+hours+'小时'+m+'分钟前'
      }
    }
  }
}

(8)近五年带周几的日期(用于小程序日期选择控件)

function mdw(){
  var year = new Date().getFullYear();//当前年
  var endYear = year+5
  let daysList = [31,28,31,30,31,30,31,31,30,31,30,31];
  var dateList = []
  for(let y = year; y<endYear;y++){
    for (let s = 0; s < 12; s++) {
    
      if ( (y % 4 ===0) && (y % 100 !==0 || y % 400 ===0) ) {
        daysList[1] = 29;
      }
      for (let j = 0;j< daysList[s]; j++) {
        var m = (s+1)>9?(s+1):'0'+(s+1);
        var d = (j+1)>9?(j+1):'0'+(j+1);
        var time = year+'/'+m+'/'+d;
        var day = new Date(time);
        var week = "日一二三四五六".charAt(day.getDay())
        dateList.push(m+'月'+d+'日'+' '+'周'+week)
        
      }
    }
  }
  
  return dateList
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值