1
0

parser.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /**
  2. * @file
  3. * Various date-related analysis methods
  4. */
  5. import { isValid, parseISO, parse, Locale } from 'date-fns';
  6. /**
  7. * Parsing value to Date object
  8. */
  9. export function compatibleParse(
  10. value: string,
  11. formatToken?: string,
  12. baseDate?: Date,
  13. locale?: Locale
  14. ): Date | null {
  15. let result = null;
  16. if (value) {
  17. if (formatToken) {
  18. baseDate = baseDate || new Date();
  19. result = parse(value, formatToken, baseDate, { locale });
  20. }
  21. if (!isValid(result)) {
  22. result = parseISO(value);
  23. }
  24. if (!isValid(result)) {
  25. result = new Date(Date.parse(value));
  26. }
  27. const yearInvalid = isValid(result) && String(result.getFullYear()).length > 4;
  28. if (!isValid(result) || yearInvalid) {
  29. result = null;
  30. }
  31. }
  32. return result;
  33. }
  34. /**
  35. * whether value can be parsed with date-fns `parse`
  36. *
  37. * @example
  38. * isValueParseValid({ value: '2021-01-01', formatToken: 'yyyy-MM-dd' }); // true
  39. * isValueParseValid({ value: '2021-01-0', formatToken: 'yyyy-MM-dd' }); // false
  40. * isValueParseValid({ value: '2021-01', formatToken: 'yyyy-MM-dd' }); // false
  41. */
  42. export function isValueParseValid(options: {
  43. value: string;
  44. formatToken: string;
  45. baseDate?: Date;
  46. locale?: Locale
  47. }) {
  48. const { value, locale, formatToken } = options;
  49. const baseDate = options.baseDate || new Date();
  50. const result = parse(value, formatToken, baseDate, { locale });
  51. return isValid(result);
  52. }