| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- export class YTDate extends Date {
- constructor(value?: number | string | Date) {
- if (!value) {
- super()
- return
- }
- if (typeof value == 'string') {
- const separator = value.charAt(4)
- value = value.split(separator).join('-')
- const ymdRegex = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/;
- if (!ymdRegex.test(value)) {
- throw new Error('传入的日期不合法')
- }
- }
- super(value)
- }
- /**
- * 将数字转换为中文周数表示(如:7 → "第七周")
- * @param weekNum - 周数数字(正整数)
- * @returns 中文周数字符串
- */
- static convertToChineseWeek(weekNum: number): string {
- // 1. 参数校验
- if (!Number.isInteger(weekNum) || weekNum <= 0) {
- throw new Error('输入必须是正整数');
- }
- // 2. 中文数字映射表
- const chineseNumbers: string[] = [
- '零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十',
- '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十'
- ];
- // 3. 处理不同范围的数字
- let result: string;
- if (weekNum <= 20) {
- // 直接使用预定义映射(1-20)
- result = chineseNumbers[weekNum];
- } else if (weekNum <= 99) {
- // 分解十位和个位(21-99)
- const tens = Math.floor(weekNum / 10);
- const units = weekNum % 10;
- result = chineseNumbers[tens] + '十';
- if (units > 0) {
- result += chineseNumbers[units];
- }
- } else {
- // 超过99的直接返回数字形式
- result = weekNum.toString();
- }
- // 4. 返回带序号的周数
- return `第${result}周`;
- }
- /**
- * 根据时间戳获取星期几的中文表示
- * @param timestamp - 时间戳(毫秒)
- * @returns 星期几的中文字符串(如"星期一")
- */
- static getDayOfWeekFromTimestamp(timestamp: number | string | Date): string {
- // 1. 创建Date对象
- const date = new YTDate(timestamp);
- // 2. 获取星期索引(0-6,0=星期日)
- const dayIndex = date.getDay();
- // 3. 映射到中文星期
- const weekdays = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
- return weekdays[dayIndex];
- }
- static getWeeks(concatenation: string = '') {
- return [concatenation + "一", concatenation + "二", concatenation + "三", concatenation + "四",
- concatenation + "五", concatenation + "六", concatenation + "日"]
- }
- /**
- * 替换日期分隔符
- * @param separator - 新的分隔符
- * @param targetStr - 目标字符串
- * @returns 替换分隔符后的字符串
- */
- static changeSeparator(separator: string, targetStr: string) {
- return targetStr.split(targetStr.charAt(4)).join(separator)
- }
- /**
- * 格式化日期
- * @param separator - 日期分隔符
- * @param date - 日期对象
- * @param onlyYMD - 是否只返回年月日
- * @returns 格式化后的日期字符串
- */
- formatDate(separator: string = '-', onlyYMD: boolean = false, date: Date = this): string {
- if (!(date instanceof Date) || isNaN(date.getTime())) {
- throw new Error('无效的日期对象');
- }
- const year = date.getFullYear();
- const month = (date.getMonth() + 1).toString().padStart(2, '0');
- const day = date.getDate().toString().padStart(2, '0');
- const hours = date.getHours().toString().padStart(2, '0');
- const minutes = date.getMinutes().toString().padStart(2, '0');
- const seconds = date.getSeconds().toString().padStart(2, '0');
- if (onlyYMD) {
- return `${year + separator + month + separator + day}`
- }
- return `${year + separator + month + separator + day} ${hours}:${minutes}:${seconds}`;
- }
- }
|