时间格式转换、JS工具函数(数字、时间转换、正则校验、获取url参数)
- 数字操作
(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)数字转化为大写金额
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)校验身份证号码
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;
}
- 操作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)判断是移动还是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)当前时间
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
}