date.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /**
  2. * 日期和时间相关
  3. *
  4. * 更复杂的日期操作建议直接使用 dayjs https://dayjs.gitee.io/docs/zh-CN/installation/installation
  5. */
  6. import dayjs from 'dayjs';
  7. import customParseFormat from 'dayjs/plugin/customParseFormat';
  8. dayjs.extend(customParseFormat);
  9. export { dayjs };
  10. /**
  11. * @group 日期格式
  12. * @groupOrder 4
  13. */
  14. export const DATE_FORMAT = 'YYYY-MM-DD';
  15. /**
  16. * @group 日期格式
  17. * @groupOrder 4
  18. */
  19. export const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';
  20. export const SECOND = 1000; // 毫秒
  21. export const MINUTE = 60 * SECOND;
  22. export const HOUR = 60 * MINUTE;
  23. export const DAY = 24 * HOUR;
  24. /**
  25. * 日期解析
  26. *
  27. * @group 日期
  28. * @groupOrder 5
  29. *
  30. * @remarks
  31. * 如果传入数字,我们假定为`毫秒` <br/>
  32. *` parseDate`会先尝试常见的日期格式(例如 YYYY/MM/DD HH:mm:ss、YYYY-MM-DD HH:mm:ss、YYYY-MM-DD),如果`parse`失败就会使用`format`
  33. *
  34. * @param dateString - 要转换成日期的数字和字符串.
  35. * @param format - 用于指定日期的格式。如果你的日期格式不是常见的格式,可以显式指定
  36. * @link https://dayjs.gitee.io/docs/zh-CN/parse/string-format
  37. *
  38. * @example
  39. * 例子:
  40. * ```typescript
  41. * parseDate(3600)
  42. * // => 1970-01-01T00:00:03.600Z
  43. *
  44. * parseDate('2012/12/10 12:12:12')
  45. * // => 2012-02-10T04:12:12.000Z
  46. * ```
  47. * @public
  48. */
  49. export function parseDate(dateString, format) {
  50. if (typeof dateString === 'number') {
  51. return new Date(dateString);
  52. }
  53. else if (dateString instanceof Date) {
  54. return dateString;
  55. }
  56. const day = dayjs(dateString, format);
  57. if (day.isValid()) {
  58. return day.toDate();
  59. }
  60. else {
  61. if (!format) {
  62. // 兼容 ios
  63. dateString = dateString.replace(/-/g, '/');
  64. dateString = dateString.replace(/T/g, ' ');
  65. }
  66. const retry = dayjs(dateString);
  67. if (retry.isValid()) {
  68. return retry.toDate();
  69. }
  70. return null;
  71. }
  72. }
  73. /**
  74. * 格式化日期
  75. *
  76. * @group 日期
  77. * @groupOrder 5
  78. *
  79. * @remarks
  80. * 如果传入数字,我们假定为`毫秒`
  81. *
  82. * @param date - 日期.
  83. * @param format - 详见 {@link https://dayjs.gitee.io/docs/zh-CN/parse/string-format}.
  84. *
  85. * @example
  86. * 例子:
  87. * ```
  88. * const day = new Date('2012/12/12 12:12:12');
  89. *
  90. * const target = formatDate(day);
  91. * // => target = "2012-02-10"
  92. *
  93. * const target2 = formatDate(day, 'YYYY-MM-DD HH:mm:ss');
  94. * // => target2 = "2012-02-10 12:12:12"
  95. * ```
  96. * @public
  97. */
  98. export function formatDate(date, format = DATE_FORMAT, parseFormat) {
  99. const parsed = parseDate(date, parseFormat);
  100. return dayjs(parsed).format(format);
  101. }