tools.js
3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
* @Date: 2022-04-18 15:59:42
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2024-01-30 15:43:33
* @FilePath: /xysBooking/src/utils/tools.js
* @Description: 通用工具函数(时间格式化、终端判断、URL 解析等)
*/
import dayjs from 'dayjs';
/**
* 格式化时间(默认到分钟)
* @param {string|number|Date} date 时间入参
* @returns {string} 格式化后的时间字符串:YYYY-MM-DD HH:mm
*/
const formatDate = (date) => {
return dayjs(date).format('YYYY-MM-DD HH:mm');
};
/**
* 判断当前运行环境(Android/iOS/微信)
* @returns {{ isAndroid: boolean, isiOS: boolean, isTable: boolean }} 终端信息
*/
const wxInfo = () => {
let u = navigator.userAgent;
let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //android终端或者uc浏览器
let isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
let uAgent = navigator.userAgent.toLowerCase();
let isTable = (uAgent.match(/MicroMessenger/i) == 'micromessenger') ? true : false;
return {
isAndroid,
isiOS,
isTable
};
};
/**
* 判断指定元素是否发生了多行溢出(常用于判断是否需要“展开/收起”)
* @param {string} id 目标 DOM 的 id
* @returns {boolean} 是否溢出
*/
const hasEllipsis = (id) => {
let oDiv = document.getElementById(id);
let flag = false;
if (oDiv.scrollHeight > oDiv.clientHeight) {
flag = true
}
return flag
}
/**
* 解析 URL 查询参数
* @param {string} url 完整 URL(包含 ?query)
* @returns {Record<string, string>} 解析后的键值对
*/
const parseQueryString = url => {
var json = {};
var arr = url.indexOf('?') >= 0 ? url.substr(url.indexOf('?') + 1).split('&') : [];
arr.forEach(item => {
var tmp = item.split('=');
json[tmp[0]] = tmp[1];
});
return json;
}
/**
* 字符串包含字符数组中字符的状态
* @param {*} array 字符数组
* @param {*} str 字符串
* @returns 包含状态
*/
const strExist = (array, str) => {
const exist = array.filter(arr => {
if (str.indexOf(arr) >= 0) return str;
})
return exist.length > 0
}
/**
* 格式化预约时段显示文本
* - 兼容后端返回的 ISO 字符串(带 Z / +08:00)以及空格分隔等形式
* - 若结束时间恰好为次日 00:00,则展示为 24:00(更符合“营业到 24:00”的直觉)
* @param {{ begin_time?: string, end_time?: string }} data 接口返回的时段对象
* @returns {string} 形如:YYYY-MM-DD HH:mm-HH:mm
*/
const formatDatetime = (data) => {
if (!data || !data.begin_time || !data.end_time) return '';
/**
* 规范化时间字符串,尽量喂给 dayjs 可解析格式
* @param {string} timeStr 原始时间字符串
* @returns {string} 规范化后的字符串
*/
const normalize = (timeStr) => {
if (!timeStr) return '';
let clean = timeStr.split('+')[0];
clean = clean.split('Z')[0];
clean = clean.trim().replace(/\s+/, 'T');
return clean;
};
const start = dayjs(normalize(data.begin_time));
const end = dayjs(normalize(data.end_time));
if (!start.isValid() || !end.isValid()) return '';
const isNextDayMidnight =
end.diff(start, 'day') === 1 &&
end.hour() === 0 &&
end.minute() === 0 &&
end.second() === 0;
const endTimeText = isNextDayMidnight ? '24:00' : end.format('HH:mm');
return `${start.format('YYYY-MM-DD')} ${start.format('HH:mm')}-${endTimeText}`;
}
export { formatDate, wxInfo, hasEllipsis, parseQueryString, strExist, formatDatetime };