index.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /* eslint-disable max-len */
  2. import { format, parse } from 'date-fns';
  3. import { toNumber } from 'lodash-es';
  4. import { strings } from '../constants';
  5. import isNullOrUndefined from '../../utils/isNullOrUndefined';
  6. import { zhCN as defaultLocale } from 'date-fns/locale';
  7. /**
  8. *
  9. * @param {string|Date|number} input
  10. * @param {string} formatToken
  11. * @param {object} dateFnsLocale
  12. * @returns {Date}
  13. */
  14. export const parseToDate = (input: string | Date | number, formatToken = strings.DEFAULT_FORMAT, dateFnsLocale = defaultLocale) => {
  15. if (input instanceof Date) {
  16. return input;
  17. } else if (typeof input === 'number' || !isNaN(Number(input))) {
  18. return new Date(toNumber(input));
  19. } else if (typeof input === 'string') {
  20. let curDate = new Date();
  21. // console.log(input, formatToken);
  22. curDate = parse(input, formatToken, curDate, { locale: dateFnsLocale });
  23. // console.log(curDate, formatToken);
  24. return curDate;
  25. }
  26. return new Date();
  27. };
  28. /**
  29. *
  30. * @param {string|Date|number} input
  31. * @returns {number}
  32. */
  33. export const parseToTimestamp = (input: string | Date | number, formatToken = strings.DEFAULT_FORMAT, dateFnsLocale = defaultLocale) => Number(parseToDate(input, formatToken, dateFnsLocale));
  34. /**
  35. *
  36. * @param {Date|number} dateOrTimestamp
  37. * @param {string} formatToken
  38. * @returns {string}
  39. */
  40. export const formatToString = (dateOrTimestamp: Date | number, formatToken = strings.DEFAULT_FORMAT, dateFnsLocale = defaultLocale) => format(dateOrTimestamp, formatToken, { locale: dateFnsLocale });
  41. export const hourIsDisabled = (disabledHours: () => boolean, hour: number) => {
  42. if (typeof disabledHours === 'function') {
  43. const disabledOptions = disabledHours();
  44. if (
  45. Array.isArray(disabledOptions) &&
  46. !isNullOrUndefined(hour) &&
  47. disabledOptions.some(v => toNumber(v) === toNumber(hour))
  48. ) {
  49. return true;
  50. }
  51. }
  52. return false;
  53. };
  54. export const minuteIsDisabled = (disabledMinutes: (hour: number) => number[], hour: number, minute: number) => {
  55. if (typeof disabledMinutes === 'function') {
  56. const disabledOptions = disabledMinutes(hour);
  57. if (
  58. Array.isArray(disabledOptions) &&
  59. !isNullOrUndefined(hour) &&
  60. !isNullOrUndefined(minute) &&
  61. disabledOptions.some(v => toNumber(v) === toNumber(minute))
  62. ) {
  63. return true;
  64. }
  65. }
  66. return false;
  67. };
  68. export const secondIsDisabled = (disabledSeconds: (hour: number, minute: number) => number[], hour: number, minute: number, second: number) => {
  69. if (typeof disabledSeconds === 'function') {
  70. const disabledOptions = disabledSeconds(hour, minute);
  71. if (
  72. Array.isArray(disabledOptions) &&
  73. !isNullOrUndefined(hour) &&
  74. !isNullOrUndefined(minute) &&
  75. !isNullOrUndefined(second) &&
  76. disabledOptions.some(v => toNumber(v) === toNumber(second))
  77. ) {
  78. return true;
  79. }
  80. }
  81. return false;
  82. };
  83. export const transformToArray = (value: any) => {
  84. if (!Array.isArray(value)) {
  85. return [];
  86. } else {
  87. return [...value];
  88. }
  89. };
  90. /**
  91. * Determine whether the time length is the same as the format
  92. * e.g.
  93. * format | time | return
  94. * HH:mm | 12:00 | true
  95. * HH:mm:ss | 12:00:00 | true
  96. * yyyy HH:mm | 2021 12:00| true
  97. * HH | 1 | false
  98. * HH:mm | 12:0 | false
  99. * HH | 1 | false
  100. * HH:mm:ss | 12:00:0 | false
  101. * @param {String} time e.g. 12:0
  102. * @param {String} formatToken e.g. HH:mm
  103. * @returns {Boolean}
  104. */
  105. export const isTimeFormatLike = (time: string, formatToken: string) => {
  106. let isLike = true;
  107. const dateFnsSupportFormatCh = 'BDEGHKLMOPQRSTXYabcehimopqstuwxyz'; // dateFns support format character
  108. const formatSupportChReg = new RegExp(`[${dateFnsSupportFormatCh}]`, 'g');
  109. const formatNotSupportChReg = new RegExp(`[^${dateFnsSupportFormatCh}]`, 'g');
  110. const hmsReg = /[H|m|s]{1,2}/;
  111. const formatSplitted = formatToken.split(formatNotSupportChReg); // => ['HH', 'mm'];
  112. const timeSeparator = formatToken.replace(formatSupportChReg, ''); // => :
  113. const timeReg = new RegExp(`[${timeSeparator}]`, 'g'); // => /[:]/g
  114. const timeSplitted = time.split(timeReg); // => ['12', '0]
  115. if (formatSplitted.length !== timeSplitted.length) {
  116. isLike = false;
  117. } else {
  118. for (let i = 0, len = timeSplitted.length; i < len; i++) {
  119. const formatStr = formatSplitted[i];
  120. const timeStr = timeSplitted[i];
  121. // Returns false if the current character corresponds to minutes and seconds and the length is less than format
  122. // when i=1 => '0'.length < 'mm'.length
  123. if (hmsReg.test(formatStr) && timeStr.length < formatStr.length) {
  124. isLike = false;
  125. break;
  126. }
  127. }
  128. }
  129. return isLike;
  130. };