Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

209 строки
5.4 KiB

  1. import dayjs from 'dayjs';
  2. import "dayjs/locale/zh-hk";
  3. import "dayjs/locale/zh-cn";
  4. var days_ZH = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];
  5. var days_CN = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];
  6. export const datetimeStr = (date) =>{
  7. return dateFormat(date,"DD/MM/YYYY HH:mm:ss")
  8. };
  9. export const dateStr = (date) =>{
  10. return dateFormat(date,"DD/MM/YYYY")
  11. };
  12. export const dateValue = (date) =>{
  13. return dateFormat(date,"YYYY-MM-DD")
  14. };
  15. export const dateStr_Year = (date) =>{
  16. return dateFormat(date,'YYYY')
  17. };
  18. export const datetimeStr_Cht = (date) =>{
  19. return dateFormat(date,"YYYY年MM月DD日 HH:mm:ss")
  20. };
  21. export const dateStr_Cht = (date) =>{
  22. return dateFormat(date,"YYYY年MM月DD日")
  23. };
  24. export const dateStr_Eng = (date) =>{
  25. return dateFormat(date,"DD MMM YYYY")
  26. };
  27. export const datetimeFieldFormat = (date) =>{
  28. return dateFormat(date,"YYYY-MM-DDTHH:mm");
  29. };
  30. export const timeFormat = (date, locale) => {
  31. if (!date) return "";
  32. let d;
  33. // 支援 LocalDateTime array
  34. if (Array.isArray(date)) {
  35. const [y, m, d1, h = 0, min = 0, s = 0] = date;
  36. d = dayjs(new Date(y, m - 1, d1, h, min, s));
  37. } else {
  38. d = dayjs(date);
  39. }
  40. if (!d.isValid()) return "";
  41. const hour = d.hour();
  42. const minute = d.minute();
  43. if (locale === "en") {
  44. return d.format("h:mm a"); // 12:00 pm
  45. }
  46. const period = hour < 12 ? "上午" : "下午";
  47. const h12 = hour % 12 === 0 ? 12 : hour % 12;
  48. if (minute === 0) {
  49. return `${period}${h12}時`;
  50. }
  51. return `${period}${h12}時${minute}分`;
  52. };
  53. export const convertToDate = (date)=>{
  54. if(typeof date == 'number'){
  55. return dayjs(date).toDate();
  56. }else if(Array.isArray(date)){
  57. // if(date.length==3){
  58. // return new Date(date[0],date[1]-1,date[2],0,0,0);
  59. // }else if(date.length==4){
  60. // return new Date(date[0],date[1]-1,date[2],0,0,0);
  61. // }
  62. return new Date(date[0]
  63. ,date[1]-1
  64. ,date[2]
  65. ,date.length>=4?date[3]:0
  66. ,date.length>=5?date[4]:0
  67. ,date.length>=6?date[5]:0);
  68. }else if(typeof date == "string"){
  69. return new Date(date);
  70. }
  71. return date;
  72. }
  73. export const toDate = (date) => {
  74. if (date === null || date === undefined || date === '') return new Date(NaN);
  75. if (typeof date === 'number') {
  76. // support seconds or millis
  77. const ms = date < 1e12 ? date * 1000 : date;
  78. return new Date(ms);
  79. }
  80. if (Array.isArray(date)) {
  81. const [y, m, d, hh = 0, mm = 0, ss = 0] = date;
  82. return new Date(y, m - 1, d, hh, mm, ss);
  83. }
  84. if (typeof date === 'string') {
  85. const normalized = date.includes(' ') && !date.includes('T') ? date.replace(' ', 'T') : date;
  86. const d = new Date(normalized);
  87. return isNaN(d.getTime()) ? new Date(NaN) : d;
  88. }
  89. return date instanceof Date ? date : new Date(NaN);
  90. };
  91. export const formatDateForLocale = (date, intl, locale) => {
  92. const fmt = intl.formatMessage({ id: "paymentMethodDatetimeStrFormat" });
  93. let s = dateFormat(date, fmt) || "";
  94. return locale === "en"
  95. ? s.replace("am", "a.m.").replace("pm", "p.m.")
  96. : s.replace("am", "上午").replace("pm", "下午").replace("00分", "");
  97. };
  98. export const is18_00 = (date) => {
  99. const d = convertToDate(date);
  100. if (!d) return false;
  101. return d.getHours() === 18 && d.getMinutes() === 0;
  102. };
  103. export const dateFormat = (date, format) =>{
  104. date = convertToDate(date);
  105. if(date) return dayjs(date).format(format);
  106. return "";
  107. };
  108. export const dateFormatWithFix = (date, format, hours, minutes) =>{
  109. date = convertToDate(date);
  110. date.setHours(hours);
  111. date.setMinutes(minutes);
  112. if(date) return dayjs(date).format(format);
  113. return "";
  114. };
  115. export const getWeekdayStr_ZH = (date) =>{
  116. date = convertToDate(date);
  117. if(date) return days_ZH[date.getDay()]
  118. return "";
  119. };
  120. export const getWeekdayStr_CN = (date) =>{
  121. date = convertToDate(date);
  122. if(date) return days_CN[date.getDay()]
  123. return "";
  124. };
  125. const formatPickerAriaDate = (dateStr, locale) => {
  126. if (!dateStr) return "";
  127. // MUI may pass a full Date string; parse via native Date first
  128. const dNative = new Date(dateStr);
  129. const d = isNaN(dNative.getTime()) ? null : dNative;
  130. if (!d) return dateStr; // fallback if parsing fails
  131. // Format only the date part (ignore time/GMT)
  132. const dj = dayjs(d);
  133. if (locale === "zh-HK" || locale === "zh") {
  134. return dj.locale("zh-hk").format("YYYY年MM月DD日");
  135. }
  136. if (locale === "zh-CN") {
  137. return dj.locale("zh-cn").format("YYYY年MM月DD日");
  138. }
  139. return dj.locale("en").format("DD MMM YYYY");
  140. };
  141. export const getPickerLocaleText = (locale) => {
  142. if (locale === "zh-HK" || locale === "zh") {
  143. return {
  144. openDatePickerDialogue: (dateStr) => {
  145. const s = formatPickerAriaDate(dateStr, locale);
  146. return s ? `選擇日期,已選日期為 ${s}` : "選擇日期";
  147. }
  148. };
  149. }
  150. if (locale === "zh-CN") {
  151. return {
  152. openDatePickerDialogue: (dateStr) => {
  153. const s = formatPickerAriaDate(dateStr, locale);
  154. return s ? `选择日期,已选日期为 ${s}` : "选择日期";
  155. }
  156. };
  157. }
  158. return {
  159. openDatePickerDialogue: (dateStr) => {
  160. const s = formatPickerAriaDate(dateStr, locale);
  161. return s ? `Choose date, selected date is ${s}` : "Choose date";
  162. }
  163. };
  164. };