格式化日期时间

224 阅读6分钟

这里主要是封装了一些对时间/日期进行格式化以及人性化处理的封装的一些公共的函数方法,下面就直接上代码

export default {
  /**
   * 根据出生日期计算星座
   * @param {*} date
   * @returns
   *
   * startMonth:
   *  根据出生月份和日期计算星座,具体计算方法为:
   *    如果出生日期小于14号,月份减一;
   *    如果大于等于14号,则不做修改。
   *    上述代码中的“865778999988”是一串数字,
   *    表示每个月14号所对应的星座,其中数字的位置对应月份。
   *    例如,第一位的数字是8,表示1月14号以前出生的人是属于摩羯座的
   *
   * getHoroscope("1998-12-24") // 射手座
   */
  getHoroscope(date) {
    let c = [
      "摩羯",
      "水瓶",
      "双鱼",
      "白羊",
      "金牛",
      "双子",
      "巨蟹",
      "狮子",
      "处女",
      "天秤",
      "天蝎",
      "射手",
      "摩羯",
    ];
    // 将传入的日期字符串转化为Date对象
    date = new Date(date);
    let month = date.getMonth() + 1;
    let day = date.getDate();
    // 获取出生月份和日期
    let startMonth = month - (day - 14 < "865778999988".charAt(month));
    return c[startMonth] + "座";
  },

  /**
   * 计算一个日期到当前日期的时间差,并返回相差的天数和小时数
   * @param {*} data
   * @returns
   *
   * sumAge("1995-01-01")
   */
  sumAge(data) {
    let dateBegin = new Date(data.replace(/-/g, "/"));
    //获取当前时间
    let dateEnd = new Date();
    //时间差的毫秒数
    let dateDiff = dateEnd.getTime() - dateBegin.getTime();
    //计算出相差天数
    let dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000));
    //计算天数后剩余的毫秒数
    let leave1 = dateDiff % (24 * 3600 * 1000);
    //计算出小时数
    let hours = Math.floor(leave1 / (3600 * 1000));
    //计算相差分钟数
    let leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
    let minutes = Math.floor(leave2 / (60 * 1000)); //计算相差分钟数
    //计算相差秒数
    let leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
    let seconds = Math.round(leave3 / 1000);
    return dayDiff + "天 " + hours + "小时 ";
  },

  /**
   * 获取聊天时间(相差300s内的信息不会显示时间)
   * 判断两聊天时间之间的间隔是否超过5分钟(300s)
   * @param {*} v1
   * @param {*} v2
   * @returns
   getChatTime(1234586754345, 1234586754897)
   */
  getChatTime(v1, v2) {
    // 判断其长度是否小于13,如果是则将其转换成以毫秒为单位的时间戳
    v1 = v1.toString().length < 13 ? v1 * 1000 : v1;
    v2 = v2.toString().length < 13 ? v2 * 1000 : v2;
    // 计算两个时间戳的差值,将结果转换成秒数。如果相差时间超过5分钟(即300秒)
    if ((parseInt(v1) - parseInt(v2)) / 1000 > 300) {
      return this.gettime(v1);
    }
  },

  /**
   * 人性化时间格式-将时间戳格式化成不同的日期格式
   * @param {*} shorttime
   * @returns
   *
   * cha < 43200:当传入时间戳与当前时间相差不到12小时时,
   * 返回的日期格式为"{A} {t}:{ii}",其中{A}表示上午或下午,
   * {t}表示小时数(12小时制),
   * {ii}表示分钟数。
   * 例如,如果传入时间戳为1620585600000(2021年5月10日上午10点),
   * 则返回"上午 10:00"。
   *
   *
   * cha < 518400:当传入时间戳与当前时间相差超过12小时但不到6天时,
   * 返回的日期格式为"{Mon}月{DD}日 {A} {t}:{ii}",
   * 其中{Mon}表示月份缩写,{DD}表示日,{A}表示上午或下午,
   * {t}表示小时数(12小时制),{ii}表示分钟数。
   * 例如,如果传入时间戳为1620000000000(2021年5月3日上午8点),
   * 则返回"5月3日 上午 8:00"
   *
   *
   *else:当传入时间戳与当前时间相差超过6天时,
   返回的日期格式为"{Y}-{MM}-{DD} {A} {t}:{ii}",
   其中{Y}表示年,{MM}表示月,{DD}表示日,{A}表示上午或下午,
   {t}表示小时数(12小时制),{ii}表示分钟数。
   例如,如果传入时间戳为1609459200000(2021年1月1日上午8点),
   则返回"2021-01-01 上午 8:00"

   gettime(162058)
   */
  gettime(shorttime) {
    // 判断传入的shorttime时间戳格式是否为毫秒级的,如果是秒级的则将其转换为毫秒级的
    shorttime = shorttime.toString().length < 13 ? shorttime * 1000 : shorttime;
    // 获取当前时间的毫秒数
    let now = new Date().getTime();
    // 获取当前时间与传入时间戳的差值,单位是秒
    let cha = (now - parseInt(shorttime)) / 1000;

    // 根据差值的大小选择不同的日期格式
    if (cha < 43200) {
      // 当天
      return this.dateFormat(new Date(shorttime), "{A} {t}:{ii}");
    } else if (cha < 518400) {
      // 隔天 显示日期+时间
      return this.dateFormat(new Date(shorttime), "{Mon}月{DD}日 {A} {t}:{ii}");
    } else {
      // 隔年 显示完整日期+时间
      return this.dateFormat(new Date(shorttime), "{Y}-{MM}-{DD} {A} {t}:{ii}");
    }
  },

  /**
   * parseNumber(num):将小于 10 的数字转换为两位数的字符串即补零操作
   * dateFormat(date, formatStr):将给定的日期对象 date 根据给定的格式字符串 formatStr 转换为字符串表示
   *
   * {Y}: 四位数的年份,例如 2023。
     {M}: 月份,范围是 1-12。
     {MM}: 两位数的月份,不足两位时前面补零。
     {Mon}: 月份的缩写,例如 1 对应 "1月"。
     {D}: 日期,范围是 1-31。
     {DD}: 两位数的日期,不足两位时前面补零。
     {h}: 小时,范围是 0-23。
     {hh}: 两位数的小时,不足两位时前面补零。
     {t}: 12 小时制的小时数,范围是 1-12。
     {tt}: 两位数的 12 小时制的小时数,不足两位时前面补零。
     {A}: 上午或下午。
     {i}: 分钟,范围是 0-59。
     {ii}: 两位数的分钟,不足两位时前面补零。
     {s}: 秒数,范围是 0-59。
     {ss}: 两位数的秒数,不足两位时前面补零。

     例如,dateFormat(new Date(), "{Y}-{MM}-{DD}") 返回当前日期的 ISO 格式字符串,例如 "2023-05-09"
     dateFormat(new Date(), "{Y}-{MM}-{DD} {t}:{ii}:{ss}") 将当前时间转换为形如 "2023-05-09 12:30:45" 的字符串
   */
  parseNumber(num) {
    return num < 10 ? "0" + num : num;
  },
  dateFormat(date, formatStr) {
    let dateObj = {},
      rStr = /\{([^}]+)\}/,
      mons = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"];

    dateObj["Y"] = date.getFullYear();
    dateObj["M"] = date.getMonth() + 1;
    dateObj["MM"] = this.parseNumber(dateObj["M"]);
    dateObj["Mon"] = mons[dateObj["M"] - 1];
    dateObj["D"] = date.getDate();
    dateObj["DD"] = this.parseNumber(dateObj["D"]);
    dateObj["h"] = date.getHours();
    dateObj["hh"] = this.parseNumber(dateObj["h"]);
    dateObj["t"] = dateObj["h"] > 12 ? dateObj["h"] - 12 : dateObj["h"];
    dateObj["tt"] = this.parseNumber(dateObj["t"]);
    dateObj["A"] = dateObj["h"] > 12 ? "下午" : "上午";
    dateObj["i"] = date.getMinutes();
    dateObj["ii"] = this.parseNumber(dateObj["i"]);
    dateObj["s"] = date.getSeconds();
    dateObj["ss"] = this.parseNumber(dateObj["s"]);

    while (rStr.test(formatStr)) {
      formatStr = formatStr.replace(rStr, dateObj[RegExp.$1]);
    }
    return formatStr;
  },

  /**
   * 根据生日计算年龄的功能
   * data 表示生日
   * @param {*} data
   * @returns
   *
   * birthday:将生日字符串转化为日期类型,并将 - 替换为 /,存储在 birthday 变量中
   * return:根据生日和当前日期计算年龄,并返回年龄;具体计算过程如下:
   * 计算当前年份减去出生年份,得到年龄。
     如果当前月份小于出生月份,年龄减一。
     如果当前月份等于出生月份,且当前日期小于出生日期,年龄减一。
     返回年龄值

    getAgeByBirthday('1999-01-01') // 24
   */
  getAgeByBirthday(data) {
    let birthday = new Date(data.replace(/-/g, "/"));
    let d = new Date();
    return (
      d.getFullYear() -
      birthday.getFullYear() -
      (d.getMonth() < birthday.getMonth() ||
      (d.getMonth() == birthday.getMonth() && d.getDate() < birthday.getDate())
        ? 1
        : 0)
    );
  },
};