dayjs.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _dayjs = _interopRequireDefault(require("dayjs"));
  8. var _weekday = _interopRequireDefault(require("dayjs/plugin/weekday"));
  9. var _localeData = _interopRequireDefault(require("dayjs/plugin/localeData"));
  10. var _weekOfYear = _interopRequireDefault(require("dayjs/plugin/weekOfYear"));
  11. var _weekYear = _interopRequireDefault(require("dayjs/plugin/weekYear"));
  12. var _quarterOfYear = _interopRequireDefault(require("dayjs/plugin/quarterOfYear"));
  13. var _advancedFormat = _interopRequireDefault(require("dayjs/plugin/advancedFormat"));
  14. var _customParseFormat = _interopRequireDefault(require("dayjs/plugin/customParseFormat"));
  15. var _warning = require("../../vc-util/warning");
  16. _dayjs.default.extend(_customParseFormat.default);
  17. _dayjs.default.extend(_advancedFormat.default);
  18. _dayjs.default.extend(_weekday.default);
  19. _dayjs.default.extend(_localeData.default);
  20. _dayjs.default.extend(_weekOfYear.default);
  21. _dayjs.default.extend(_weekYear.default);
  22. _dayjs.default.extend(_quarterOfYear.default);
  23. _dayjs.default.extend((_o, c) => {
  24. // todo support Wo (ISO week)
  25. const proto = c.prototype;
  26. const oldFormat = proto.format;
  27. proto.format = function f(formatStr) {
  28. const str = (formatStr || '').replace('Wo', 'wo');
  29. return oldFormat.bind(this)(str);
  30. };
  31. });
  32. const localeMap = {
  33. // ar_EG:
  34. // az_AZ:
  35. // bg_BG:
  36. bn_BD: 'bn-bd',
  37. by_BY: 'be',
  38. // ca_ES:
  39. // cs_CZ:
  40. // da_DK:
  41. // de_DE:
  42. // el_GR:
  43. en_GB: 'en-gb',
  44. en_US: 'en',
  45. // es_ES:
  46. // et_EE:
  47. // fa_IR:
  48. // fi_FI:
  49. fr_BE: 'fr',
  50. fr_CA: 'fr-ca',
  51. // fr_FR:
  52. // ga_IE:
  53. // gl_ES:
  54. // he_IL:
  55. // hi_IN:
  56. // hr_HR:
  57. // hu_HU:
  58. hy_AM: 'hy-am',
  59. // id_ID:
  60. // is_IS:
  61. // it_IT:
  62. // ja_JP:
  63. // ka_GE:
  64. // kk_KZ:
  65. // km_KH:
  66. kmr_IQ: 'ku',
  67. // kn_IN:
  68. // ko_KR:
  69. // ku_IQ: // previous ku in antd
  70. // lt_LT:
  71. // lv_LV:
  72. // mk_MK:
  73. // ml_IN:
  74. // mn_MN:
  75. // ms_MY:
  76. // nb_NO:
  77. // ne_NP:
  78. nl_BE: 'nl-be',
  79. // nl_NL:
  80. // pl_PL:
  81. pt_BR: 'pt-br',
  82. // pt_PT:
  83. // ro_RO:
  84. // ru_RU:
  85. // sk_SK:
  86. // sl_SI:
  87. // sr_RS:
  88. // sv_SE:
  89. // ta_IN:
  90. // th_TH:
  91. // tr_TR:
  92. // uk_UA:
  93. // ur_PK:
  94. // vi_VN:
  95. zh_CN: 'zh-cn',
  96. zh_HK: 'zh-hk',
  97. zh_TW: 'zh-tw'
  98. };
  99. const parseLocale = locale => {
  100. const mapLocale = localeMap[locale];
  101. return mapLocale || locale.split('_')[0];
  102. };
  103. const parseNoMatchNotice = () => {
  104. /* istanbul ignore next */
  105. (0, _warning.noteOnce)(false, 'Not match any format. Please help to fire a issue about this.');
  106. };
  107. const advancedFormatRegex = /\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|k{1,2}|S/g;
  108. function findTargetStr(val, index, segmentation) {
  109. const items = [...new Set(val.split(segmentation))];
  110. let idx = 0;
  111. for (let i = 0; i < items.length; i++) {
  112. const item = items[i];
  113. idx += item.length;
  114. if (idx > index) {
  115. return item;
  116. }
  117. idx += segmentation.length;
  118. }
  119. }
  120. const toDateWithValueFormat = (val, valueFormat) => {
  121. if (!val) return null;
  122. if (_dayjs.default.isDayjs(val)) {
  123. return val;
  124. }
  125. const matchs = valueFormat.matchAll(advancedFormatRegex);
  126. let baseDate = (0, _dayjs.default)(val, valueFormat);
  127. if (matchs === null) {
  128. return baseDate;
  129. }
  130. for (const match of matchs) {
  131. const origin = match[0];
  132. const index = match['index'];
  133. if (origin === 'Q') {
  134. const segmentation = val.slice(index - 1, index);
  135. const quarterStr = findTargetStr(val, index, segmentation).match(/\d+/)[0];
  136. baseDate = baseDate.quarter(parseInt(quarterStr));
  137. }
  138. if (origin.toLowerCase() === 'wo') {
  139. const segmentation = val.slice(index - 1, index);
  140. const weekStr = findTargetStr(val, index, segmentation).match(/\d+/)[0];
  141. baseDate = baseDate.week(parseInt(weekStr));
  142. }
  143. if (origin.toLowerCase() === 'ww') {
  144. baseDate = baseDate.week(parseInt(val.slice(index, index + origin.length)));
  145. }
  146. if (origin.toLowerCase() === 'w') {
  147. baseDate = baseDate.week(parseInt(val.slice(index, index + origin.length + 1)));
  148. }
  149. }
  150. return baseDate;
  151. };
  152. const generateConfig = {
  153. // get
  154. getNow: () => (0, _dayjs.default)(),
  155. getFixedDate: string => (0, _dayjs.default)(string, ['YYYY-M-DD', 'YYYY-MM-DD']),
  156. getEndDate: date => date.endOf('month'),
  157. getWeekDay: date => {
  158. const clone = date.locale('en');
  159. return clone.weekday() + clone.localeData().firstDayOfWeek();
  160. },
  161. getYear: date => date.year(),
  162. getMonth: date => date.month(),
  163. getDate: date => date.date(),
  164. getHour: date => date.hour(),
  165. getMinute: date => date.minute(),
  166. getSecond: date => date.second(),
  167. // set
  168. addYear: (date, diff) => date.add(diff, 'year'),
  169. addMonth: (date, diff) => date.add(diff, 'month'),
  170. addDate: (date, diff) => date.add(diff, 'day'),
  171. setYear: (date, year) => date.year(year),
  172. setMonth: (date, month) => date.month(month),
  173. setDate: (date, num) => date.date(num),
  174. setHour: (date, hour) => date.hour(hour),
  175. setMinute: (date, minute) => date.minute(minute),
  176. setSecond: (date, second) => date.second(second),
  177. // Compare
  178. isAfter: (date1, date2) => date1.isAfter(date2),
  179. isValidate: date => date.isValid(),
  180. locale: {
  181. getWeekFirstDay: locale => (0, _dayjs.default)().locale(parseLocale(locale)).localeData().firstDayOfWeek(),
  182. getWeekFirstDate: (locale, date) => date.locale(parseLocale(locale)).weekday(0),
  183. getWeek: (locale, date) => date.locale(parseLocale(locale)).week(),
  184. getShortWeekDays: locale => (0, _dayjs.default)().locale(parseLocale(locale)).localeData().weekdaysMin(),
  185. getShortMonths: locale => (0, _dayjs.default)().locale(parseLocale(locale)).localeData().monthsShort(),
  186. format: (locale, date, format) => date.locale(parseLocale(locale)).format(format),
  187. parse: (locale, text, formats) => {
  188. const localeStr = parseLocale(locale);
  189. for (let i = 0; i < formats.length; i += 1) {
  190. const format = formats[i];
  191. const formatText = text;
  192. if (format.includes('wo') || format.includes('Wo')) {
  193. // parse Wo
  194. const year = formatText.split('-')[0];
  195. const weekStr = formatText.split('-')[1];
  196. const firstWeek = (0, _dayjs.default)(year, 'YYYY').startOf('year').locale(localeStr);
  197. for (let j = 0; j <= 52; j += 1) {
  198. const nextWeek = firstWeek.add(j, 'week');
  199. if (nextWeek.format('Wo') === weekStr) {
  200. return nextWeek;
  201. }
  202. }
  203. parseNoMatchNotice();
  204. return null;
  205. }
  206. const date = (0, _dayjs.default)(formatText, format, true).locale(localeStr);
  207. if (date.isValid()) {
  208. return date;
  209. }
  210. }
  211. if (!text) {
  212. parseNoMatchNotice();
  213. }
  214. return null;
  215. }
  216. },
  217. toDate: (value, valueFormat) => {
  218. if (Array.isArray(value)) {
  219. return value.map(val => toDateWithValueFormat(val, valueFormat));
  220. } else {
  221. return toDateWithValueFormat(value, valueFormat);
  222. }
  223. },
  224. toString: (value, valueFormat) => {
  225. if (Array.isArray(value)) {
  226. return value.map(val => _dayjs.default.isDayjs(val) ? val.format(valueFormat) : val);
  227. } else {
  228. return _dayjs.default.isDayjs(value) ? value.format(valueFormat) : value;
  229. }
  230. }
  231. };
  232. var _default = exports.default = generateConfig;