借助dayjs,把各种类型的日期转换成“YYYY-MM-DD“格式

记得先 npm install datajs

思路是先把中文转成阿拉伯数字,然后把各种格式转成 “YYYY-MM-DD”,这样前端就可以排序了

<template>
  <div class="home">

  </div>
</template>
<script lang="ts" setup>
import { reactive, ref } from "vue";

import dayjs from "dayjs";
import customParseFormat from "dayjs/plugin/customParseFormat";

// 导入自定义解析格式插件
dayjs.extend(customParseFormat);

// 原始日期数组
const dates = [
  "2023-12-31",
  "2023-12",
  "2022/11/30",
  "2021/10/29",
  "2020年9月01日",
  "2020年1月",
  "2020-10-01",
  "2020-9-1",
  "2021-0-10",
  "1999-10-0",
  "1979-0-0",
  "1979-0",
  "2020/10/01",
  "2020/10",
  "2029",
  "2020/1/1",
  "2020年十月一日",
  "2020年十月1日",
  "2020年11月1日",
  "2020年十月",
  "2020年",
  "19世纪",
  "十三世纪",
  "十八世纪70年代",
  "20世纪70年代",
  "19世纪三十年代",
  "二十世纪90年代",
  "三十世纪四十年代",
  "17世纪70年代",
  "十九世纪90年代",
  "十二世纪十九年代",
];

const chineseNumberMap = {
  一: 1,
  二: 2,
  三: 3,
  四: 4,
  五: 5,
  六: 6,
  七: 7,
  八: 8,
  九: 9,
  十: 1,
};
// 转换为相同格式的日期数组  因为我的数据里有年月是0 情况
const formattedDates = dates.map((date) => {
  let oldDate = date;
  // 把0月0日转为1月1日;
  date = date.replace(/-0-/g, "-1-").replace(/-0$/, "-1");
  let parsedDate;

  // 此处解决 中文数量转成数字 会多一个零的问题  比如十九世纪会转成109,    此处还要兼容月的 是十的情况
  if (date.indexOf("世纪") > 0) {
    chineseNumberMap["十"] = 0;
  } else {
    chineseNumberMap["十"] = 10;
  }

  // 将中文数字转换为阿拉伯数字
  date = date.replace(/[一二三四五六七八九十]+/g, (match) => {
    let number = "";
    for (let i = 0; i < match.length; i++) {
      number += chineseNumberMap[match[i]];
    }
    return number;
  });
  // 尝试解析日期字符串
  if (date.match(/^\d{4}-\d{2}-\d{2}$/)) {
    parsedDate = dayjs(date, "YYYY-MM-DD", true);
  } else if (date.match(/^\d{4}\/\d{2}\/\d{2}$/)) {
    parsedDate = dayjs(date, "YYYY/MM/DD", true);
  } else if (date.match(/^\d{4}年\d{2}月\d{2}日$/)) {
    parsedDate = dayjs(date, "YYYY年MM月DD日", true);
  } else if (date.match(/^\d{4}年十月一日$/)) {
    parsedDate = dayjs(date, "YYYY年十月一日", true);
  } else if (date.match(/^\d{4}年十月\d{1,2}日$/)) {
    parsedDate = dayjs(date, "YYYY年十月DD日", true);
  } else if (date.match(/^\d{4}年\d{1,2}月\d{1,2}日$/)) {
    parsedDate = dayjs(date, "YYYY年MM月DD日", true);
  } else if (date.match(/^\d{4}年十月$/)) {
    parsedDate = dayjs(date, "YYYY年十月", true);
  } else if (date.match(/^\d{4}年$/)) {
    parsedDate = dayjs(date, "YYYY年", true);
  } else if (date.includes("世纪") || date.includes("年代")) {
    // if (date.includes("世纪")) {
    //   const centuryMatch = date.match(/(\d+)世纪/);
    //   if (centuryMatch) {
    //     const century = parseInt(centuryMatch[1]);
    //     const startYear = (century - 1) * 100 + 1;
    //     parsedDate = dayjs(`${startYear}-01-01`, "YYYY-MM-DD");
    //   }
    // } else if (date.includes("年代")) {
    //   const decadeMatch = date.match(/(\d+)年代/);
    //   if (decadeMatch) {
    //     const decade = parseInt(decadeMatch[1]);
    //     const startYear = decade * 10 - 9;
    //     parsedDate = dayjs(`${startYear}-01-01`, "YYYY-MM-DD");
    //   }
    // }
    // 世纪和年代拼接为年 由于中文数量转阿拉伯数字  十的转换 问题,如果二者有小于10则+10
    // 太low了不会写
    let century;
    let decade;
    if (date.includes("世纪")) {
      const centuryMatch = date.match(/(\d+)世纪/);
      if (centuryMatch) {
        century = parseInt(centuryMatch[1]);
        century = century - 1;

        if (century < 10) {
          century = century + 10;
        }
      }
    }
    if (date.includes("年代")) {
      const decadeMatch = date.match(/(\d+)年代/);
      if (decadeMatch) {
        decade = parseInt(decadeMatch[1]);
        if (decade < 10) {
          decade = decade + 10;
        }
        //年代末 年加6  ,只给一个后半段的年
         if (date.includes("年代末")) {
          decade = decade + 6
          }
      }
    }

    let startYear = century + "" + (decade ? decade : "00");
    // console.log("century", century);
    // console.log("decade", decade);
    // console.log("startYear", startYear);

    parsedDate = dayjs(`${startYear}-01-01`, "YYYY-MM-DD");
  } else {
    parsedDate = dayjs(date, true);
  }
  // 设置dayjs转换规则
  if (!parsedDate.isValid()) {
    // Handle non-standard date formats
    // 这里理论上写一个就行,但是不知道为何要都写上
    parsedDate = dayjs(date, [
      "YYYY-MM-DD",
      "YYYY/MM/DD",
      "YYYY/M/D",
      "YYYY年MM月DD日",
      "YYYY/MM",
      "YYYY",
      "YYYY年MM月",
      "YYYY年",
      "YYYY年M月D日",
      "YYYY年M月",
    ]);
  }
  console.log(
    oldDate + "-------------------" + parsedDate.format("YYYY-MM-DD")
  );
  return parsedDate.format("YYYY-MM-DD");
});

// console.log("------------------------");
// console.log(formattedDates);

</script>

<style lang="scss">
</style>

在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给钱,谢谢!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值