记得先 npm install datajs
<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,
};
// 转换为相同格式的日期数组
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;
}
}
}
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>