tools.js 3.46 KB
/*
 * @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 };