YTDate.ets 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. export class YTDate extends Date {
  2. constructor(value?: number | string | Date) {
  3. if (!value) {
  4. super()
  5. return
  6. }
  7. if (typeof value == 'string') {
  8. const separator = value.charAt(4)
  9. value = value.split(separator).join('-')
  10. const ymdRegex = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/;
  11. if (!ymdRegex.test(value)) {
  12. throw new Error('传入的日期不合法')
  13. }
  14. }
  15. super(value)
  16. }
  17. /**
  18. * 将数字转换为中文周数表示(如:7 → "第七周")
  19. * @param weekNum - 周数数字(正整数)
  20. * @returns 中文周数字符串
  21. */
  22. static convertToChineseWeek(weekNum: number): string {
  23. // 1. 参数校验
  24. if (!Number.isInteger(weekNum) || weekNum <= 0) {
  25. throw new Error('输入必须是正整数');
  26. }
  27. // 2. 中文数字映射表
  28. const chineseNumbers: string[] = [
  29. '零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十',
  30. '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十'
  31. ];
  32. // 3. 处理不同范围的数字
  33. let result: string;
  34. if (weekNum <= 20) {
  35. // 直接使用预定义映射(1-20)
  36. result = chineseNumbers[weekNum];
  37. } else if (weekNum <= 99) {
  38. // 分解十位和个位(21-99)
  39. const tens = Math.floor(weekNum / 10);
  40. const units = weekNum % 10;
  41. result = chineseNumbers[tens] + '十';
  42. if (units > 0) {
  43. result += chineseNumbers[units];
  44. }
  45. } else {
  46. // 超过99的直接返回数字形式
  47. result = weekNum.toString();
  48. }
  49. // 4. 返回带序号的周数
  50. return `第${result}周`;
  51. }
  52. /**
  53. * 根据时间戳获取星期几的中文表示
  54. * @param timestamp - 时间戳(毫秒)
  55. * @returns 星期几的中文字符串(如"星期一")
  56. */
  57. static getDayOfWeekFromTimestamp(timestamp: number | string | Date): string {
  58. // 1. 创建Date对象
  59. const date = new YTDate(timestamp);
  60. // 2. 获取星期索引(0-6,0=星期日)
  61. const dayIndex = date.getDay();
  62. // 3. 映射到中文星期
  63. const weekdays = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
  64. return weekdays[dayIndex];
  65. }
  66. static getWeeks(concatenation: string = '') {
  67. return [concatenation + "一", concatenation + "二", concatenation + "三", concatenation + "四",
  68. concatenation + "五", concatenation + "六", concatenation + "日"]
  69. }
  70. /**
  71. * 替换日期分隔符
  72. * @param separator - 新的分隔符
  73. * @param targetStr - 目标字符串
  74. * @returns 替换分隔符后的字符串
  75. */
  76. static changeSeparator(separator: string, targetStr: string) {
  77. return targetStr.split(targetStr.charAt(4)).join(separator)
  78. }
  79. /**
  80. * 格式化日期
  81. * @param separator - 日期分隔符
  82. * @param date - 日期对象
  83. * @param onlyYMD - 是否只返回年月日
  84. * @returns 格式化后的日期字符串
  85. */
  86. formatDate(separator: string = '-', onlyYMD: boolean = false, date: Date = this): string {
  87. if (!(date instanceof Date) || isNaN(date.getTime())) {
  88. throw new Error('无效的日期对象');
  89. }
  90. const year = date.getFullYear();
  91. const month = (date.getMonth() + 1).toString().padStart(2, '0');
  92. const day = date.getDate().toString().padStart(2, '0');
  93. const hours = date.getHours().toString().padStart(2, '0');
  94. const minutes = date.getMinutes().toString().padStart(2, '0');
  95. const seconds = date.getSeconds().toString().padStart(2, '0');
  96. if (onlyYMD) {
  97. return `${year + separator + month + separator + day}`
  98. }
  99. return `${year + separator + month + separator + day} ${hours}:${minutes}:${seconds}`;
  100. }
  101. }