fecha.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. /* Modified from https://github.com/taylorhakes/fecha
  2. * v4.1.0
  3. * hugh zhuang 把 YYYY-MM-DD 改成了 yyyy-MM-dd 与java后台 统一格式
  4. * YYYY修改为yyyy
  5. *
  6. * 备注:未支持多个国际化,该代码参考element-ui的日期帮助类
  7. * 增加日期格式处理
  8. * The MIT License (MIT)
  9. *
  10. * Copyright (c) 2015 Taylor Hakes
  11. *
  12. * Permission is hereby granted, free of charge, to any person obtaining a copy
  13. * of this software and associated documentation files (the "Software"), to deal
  14. * in the Software without restriction, including without limitation the rights
  15. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  16. * copies of the Software, and to permit persons to whom the Software is
  17. * furnished to do so, subject to the following conditions:
  18. *
  19. * The above copyright notice and this permission notice shall be included in all
  20. * copies or substantial portions of the Software.
  21. *
  22. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  23. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  24. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  25. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  26. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  27. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  28. * SOFTWARE.
  29. */
  30. var token =
  31. /d{1,4}|M{1,4}|yy(?:yy)?|S{1,3}|Do|ZZ|Z|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g
  32. var twoDigitsOptional = '[1-9]\\d?'
  33. var twoDigits = '\\d\\d'
  34. var threeDigits = '\\d{3}'
  35. var fourDigits = '\\d{4}'
  36. var word = '[^\\s]+'
  37. var literal = /\[([^]*?)\]/gm
  38. function shorten(arr, sLen) {
  39. var newArr = []
  40. for (var i = 0, len = arr.length; i < len; i++) {
  41. newArr.push(arr[i].substr(0, sLen))
  42. }
  43. return newArr
  44. }
  45. var monthUpdate = function (arrName) {
  46. return function (v, i18n) {
  47. var lowerCaseArr = i18n[arrName].map(function (v) {
  48. return v.toLowerCase()
  49. })
  50. var index = lowerCaseArr.indexOf(v.toLowerCase())
  51. if (index > -1) {
  52. return index
  53. }
  54. return null
  55. }
  56. }
  57. function assign(origObj) {
  58. var args = []
  59. for (var _i = 1; _i < arguments.length; _i++) {
  60. args[_i - 1] = arguments[_i]
  61. }
  62. for (var _a = 0, args_1 = args; _a < args_1.length; _a++) {
  63. var obj = args_1[_a]
  64. for (var key in obj) {
  65. // @ts-ignore ex
  66. origObj[key] = obj[key]
  67. }
  68. }
  69. return origObj
  70. }
  71. var dayNames = [
  72. 'Sunday',
  73. 'Monday',
  74. 'Tuesday',
  75. 'Wednesday',
  76. 'Thursday',
  77. 'Friday',
  78. 'Saturday'
  79. ]
  80. var monthNames = [
  81. 'January',
  82. 'February',
  83. 'March',
  84. 'April',
  85. 'May',
  86. 'June',
  87. 'July',
  88. 'August',
  89. 'September',
  90. 'October',
  91. 'November',
  92. 'December'
  93. ]
  94. var monthNamesShort = shorten(monthNames, 3)
  95. var dayNamesShort = shorten(dayNames, 3)
  96. var defaultI18n = {
  97. dayNamesShort: dayNamesShort,
  98. dayNames: dayNames,
  99. monthNamesShort: monthNamesShort,
  100. monthNames: monthNames,
  101. amPm: ['am', 'pm'],
  102. DoFn: function (dayOfMonth) {
  103. return (
  104. dayOfMonth +
  105. ['th', 'st', 'nd', 'rd'][
  106. dayOfMonth % 10 > 3
  107. ? 0
  108. : ((dayOfMonth - (dayOfMonth % 10) !== 10 ? 1 : 0) * dayOfMonth) % 10
  109. ]
  110. )
  111. }
  112. }
  113. var globalI18n = assign({}, defaultI18n)
  114. var setGlobalDateI18n = function (i18n) {
  115. return (globalI18n = assign(globalI18n, i18n))
  116. }
  117. var regexEscape = function (str) {
  118. return str.replace(/[|\\{()[^$+*?.-]/g, '\\$&')
  119. }
  120. var pad = function (val, len) {
  121. if (len === void 0) {
  122. len = 2
  123. }
  124. val = String(val)
  125. while (val.length < len) {
  126. val = '0' + val
  127. }
  128. return val
  129. }
  130. var formatFlags = {
  131. d: function (dateObj) {
  132. return String(dateObj.getDate())
  133. }, // zxh D 修改为 d
  134. dd: function (dateObj) {
  135. return pad(dateObj.getDate())
  136. }, // zxh DD 修改为 dd
  137. do: function (dateObj, i18n) {
  138. // zxh Do 修改为 do
  139. return i18n.DoFn(dateObj.getDate())
  140. },
  141. D: function (dateObj) {
  142. return String(dateObj.getDay())
  143. }, // zxh d 修改为D
  144. DD: function (dateObj) {
  145. return pad(dateObj.getDay())
  146. }, // zxh dd 修改为 DD
  147. DDD: function (dateObj, i18n) {
  148. // zxh ddd 修改为 DDD
  149. return i18n.dayNamesShort[dateObj.getDay()]
  150. },
  151. DDDD: function (dateObj, i18n) {
  152. // zxh dddd 修改为 DDDD
  153. return i18n.dayNames[dateObj.getDay()]
  154. },
  155. M: function (dateObj) {
  156. return String(dateObj.getMonth() + 1)
  157. },
  158. MM: function (dateObj) {
  159. return pad(dateObj.getMonth() + 1)
  160. },
  161. MMM: function (dateObj, i18n) {
  162. return i18n.monthNamesShort[dateObj.getMonth()]
  163. },
  164. MMMM: function (dateObj, i18n) {
  165. return i18n.monthNames[dateObj.getMonth()]
  166. },
  167. yy: function (dateObj) {
  168. // zxh 修改 YY 修改为 yy
  169. return pad(String(dateObj.getFullYear()), 4).substr(2)
  170. },
  171. yyyy: function (dateObj) {
  172. return pad(dateObj.getFullYear(), 4)
  173. }, // zxh 修改 YYYY 修改为 yyyy
  174. h: function (dateObj) {
  175. return String(dateObj.getHours() % 12 || 12)
  176. },
  177. hh: function (dateObj) {
  178. return pad(dateObj.getHours() % 12 || 12)
  179. },
  180. H: function (dateObj) {
  181. return String(dateObj.getHours())
  182. },
  183. HH: function (dateObj) {
  184. return pad(dateObj.getHours())
  185. },
  186. m: function (dateObj) {
  187. return String(dateObj.getMinutes())
  188. },
  189. mm: function (dateObj) {
  190. return pad(dateObj.getMinutes())
  191. },
  192. s: function (dateObj) {
  193. return String(dateObj.getSeconds())
  194. },
  195. ss: function (dateObj) {
  196. return pad(dateObj.getSeconds())
  197. },
  198. S: function (dateObj) {
  199. return String(Math.round(dateObj.getMilliseconds() / 100))
  200. },
  201. SS: function (dateObj) {
  202. return pad(Math.round(dateObj.getMilliseconds() / 10), 2)
  203. },
  204. SSS: function (dateObj) {
  205. return pad(dateObj.getMilliseconds(), 3)
  206. },
  207. a: function (dateObj, i18n) {
  208. return dateObj.getHours() < 12 ? i18n.amPm[0] : i18n.amPm[1]
  209. },
  210. A: function (dateObj, i18n) {
  211. return dateObj.getHours() < 12
  212. ? i18n.amPm[0].toUpperCase()
  213. : i18n.amPm[1].toUpperCase()
  214. },
  215. ZZ: function (dateObj) {
  216. var offset = dateObj.getTimezoneOffset()
  217. return (
  218. (offset > 0 ? '-' : '+') +
  219. pad(Math.floor(Math.abs(offset) / 60) * 100 + (Math.abs(offset) % 60), 4)
  220. )
  221. },
  222. Z: function (dateObj) {
  223. var offset = dateObj.getTimezoneOffset()
  224. return (
  225. (offset > 0 ? '-' : '+') +
  226. pad(Math.floor(Math.abs(offset) / 60), 2) +
  227. ':' +
  228. pad(Math.abs(offset) % 60, 2)
  229. )
  230. }
  231. }
  232. var monthParse = function (v) {
  233. return +v - 1
  234. }
  235. var emptyDigits = [null, twoDigitsOptional]
  236. var emptyWord = [null, word]
  237. var amPm = [
  238. 'isPm',
  239. word,
  240. function (v, i18n) {
  241. var val = v.toLowerCase()
  242. if (val === i18n.amPm[0]) {
  243. return 0
  244. } else if (val === i18n.amPm[1]) {
  245. return 1
  246. }
  247. return null
  248. }
  249. ]
  250. var timezoneOffset = [
  251. 'timezoneOffset',
  252. '[^\\s]*?[\\+\\-]\\d\\d:?\\d\\d|[^\\s]*?Z?',
  253. function (v) {
  254. var parts = (v + '').match(/([+-]|\d\d)/gi)
  255. if (parts) {
  256. var minutes = +parts[1] * 60 + parseInt(parts[2], 10)
  257. return parts[0] === '+' ? minutes : -minutes
  258. }
  259. return 0
  260. }
  261. ]
  262. var parseFlags = {
  263. d: ['day', twoDigitsOptional], // zxh D 修改为 d
  264. dd: ['day', twoDigits], // zxh DD 修改为 dd
  265. do: [
  266. 'day',
  267. twoDigitsOptional + word,
  268. function (v) {
  269. return parseInt(v, 10)
  270. }
  271. ], // zxh D0 修改为 do
  272. M: ['month', twoDigitsOptional, monthParse],
  273. MM: ['month', twoDigits, monthParse],
  274. YY: [
  275. 'year',
  276. twoDigits,
  277. function (v) {
  278. var now = new Date()
  279. var cent = +('' + now.getFullYear()).substr(0, 2)
  280. return +('' + (+v > 68 ? cent - 1 : cent) + v)
  281. }
  282. ],
  283. h: ['hour', twoDigitsOptional, undefined, 'isPm'],
  284. hh: ['hour', twoDigits, undefined, 'isPm'],
  285. H: ['hour', twoDigitsOptional],
  286. HH: ['hour', twoDigits],
  287. m: ['minute', twoDigitsOptional],
  288. mm: ['minute', twoDigits],
  289. s: ['second', twoDigitsOptional],
  290. ss: ['second', twoDigits],
  291. yyyy: ['year', fourDigits], // zxh YYYY修改为yyyy
  292. S: [
  293. 'millisecond',
  294. '\\d',
  295. function (v) {
  296. return +v * 100
  297. }
  298. ],
  299. SS: [
  300. 'millisecond',
  301. twoDigits,
  302. function (v) {
  303. return +v * 10
  304. }
  305. ],
  306. SSS: ['millisecond', threeDigits],
  307. D: emptyDigits, // zxh d 修改为 D
  308. DD: emptyDigits, // zxh dd 修改为 DD
  309. DDD: emptyWord,
  310. DDDD: emptyWord,
  311. MMM: ['month', word, monthUpdate('monthNamesShort')],
  312. MMMM: ['month', word, monthUpdate('monthNames')],
  313. a: amPm,
  314. A: amPm,
  315. ZZ: timezoneOffset,
  316. Z: timezoneOffset
  317. }
  318. // Some common format strings
  319. var globalMasks = {
  320. default: 'yyyy-MM-dd HH:mm:ss',
  321. shortDate: 'M/d/yy',
  322. mediumDate: 'MMM D, yyyy',
  323. longDate: 'MMMM d, yyyy',
  324. fullDate: 'DDDD, MMMM d, yyyy',
  325. isoDate: 'yyyy-MM-dd',
  326. isoDateTime: 'yyyy-MM-ddTHH:mm:ssZ',
  327. shortTime: 'HH:mm',
  328. mediumTime: 'HH:mm:ss',
  329. longTime: 'HH:mm:ss.SSS'
  330. }
  331. var setGlobalDateMasks = function (masks) {
  332. return assign(globalMasks, masks)
  333. }
  334. /** *
  335. * Format a date
  336. * @method format
  337. * @param {Date|number} dateObj
  338. * @param {string} mask Format of the date, i.e. 'mm-dd-yy' or 'shortDate'
  339. * @returns {string} Formatted date string
  340. */
  341. var format = function (dateObj, mask, i18n) {
  342. if (dateObj === null || dateObj === undefined) return ''
  343. if (mask === void 0) {
  344. mask = globalMasks['default']
  345. }
  346. if (i18n === void 0) {
  347. i18n = {}
  348. }
  349. if (typeof dateObj === 'number') {
  350. dateObj = new Date(dateObj)
  351. }
  352. if (
  353. Object.prototype.toString.call(dateObj) !== '[object Date]' ||
  354. isNaN(dateObj.getTime())
  355. ) {
  356. throw new Error('Invalid Date pass to format')
  357. }
  358. mask = globalMasks[mask] || mask
  359. var literals = []
  360. // Make literals inactive by replacing them with @@@
  361. mask = mask.replace(literal, function ($0, $1) {
  362. literals.push($1)
  363. return '@@@'
  364. })
  365. var combinedI18nSettings = assign(assign({}, globalI18n), i18n)
  366. // Apply formatting rules
  367. mask = mask.replace(token, function ($0) {
  368. return formatFlags[$0](dateObj, combinedI18nSettings)
  369. })
  370. // Inline literal values back into the formatted value
  371. return mask.replace(/@@@/g, function () {
  372. return literals.shift()
  373. })
  374. }
  375. /**
  376. * Parse a date string into a Javascript Date object /
  377. * @method parse
  378. * @param {string} dateStr Date string
  379. * @param {string} format Date parse format
  380. * @param {i18n} I18nSettingsOptional Full or subset of I18N settings
  381. * @returns {Date|null} Returns Date object. Returns null what date string is invalid or doesn't match format
  382. */
  383. function parse(dateStr, format, i18n) {
  384. if (dateStr === null || dateStr === undefined) return ''
  385. if (i18n === void 0) {
  386. i18n = {}
  387. }
  388. if (typeof format !== 'string') {
  389. throw new Error('Invalid format in fecha parse')
  390. }
  391. // Check to see if the format is actually a mask
  392. format = globalMasks[format] || format
  393. // Avoid regular expression denial of service, fail early for really long strings
  394. // https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS
  395. if (dateStr.length > 1000) {
  396. return null
  397. }
  398. // Default to the beginning of the year.
  399. var today = new Date()
  400. var dateInfo = {
  401. year: today.getFullYear(),
  402. month: 0,
  403. day: 1,
  404. hour: 0,
  405. minute: 0,
  406. second: 0,
  407. millisecond: 0,
  408. isPm: null,
  409. timezoneOffset: null
  410. }
  411. var parseInfo = []
  412. var literals = []
  413. // Replace all the literals with @@@. Hopefully a string that won't exist in the format
  414. var newFormat = format.replace(literal, function ($0, $1) {
  415. literals.push(regexEscape($1))
  416. return '@@@'
  417. })
  418. var specifiedFields = {}
  419. var requiredFields = {}
  420. // Change every token that we find into the correct regex
  421. newFormat = regexEscape(newFormat).replace(token, function ($0) {
  422. var info = parseFlags[$0]
  423. var field = info[0]
  424. var regex = info[1]
  425. var requiredField = info[3]
  426. // Check if the person has specified the same field twice. This will lead to confusing results.
  427. if (specifiedFields[field]) {
  428. throw new Error('Invalid format. ' + field + ' specified twice in format')
  429. }
  430. specifiedFields[field] = true
  431. // Check if there are any required fields. For instance, 12 hour time requires AM/PM specified
  432. if (requiredField) {
  433. requiredFields[requiredField] = true
  434. }
  435. parseInfo.push(info)
  436. return '(' + regex + ')'
  437. })
  438. // Check all the required fields are present
  439. Object.keys(requiredFields).forEach(function (field) {
  440. if (!specifiedFields[field]) {
  441. throw new Error(
  442. 'Invalid format. ' + field + ' is required in specified format'
  443. )
  444. }
  445. })
  446. // Add back all the literals after
  447. newFormat = newFormat.replace(/@@@/g, function () {
  448. return literals.shift()
  449. })
  450. // Check if the date string matches the format. If it doesn't return null
  451. var matches = dateStr.match(new RegExp(newFormat, 'i'))
  452. if (!matches) {
  453. return null
  454. }
  455. var combinedI18nSettings = assign(assign({}, globalI18n), i18n)
  456. // For each match, call the parser function for that date part
  457. for (var i = 1; i < matches.length; i++) {
  458. var _a = parseInfo[i - 1]
  459. var field = _a[0]
  460. var parser = _a[2]
  461. var value = parser ? parser(matches[i], combinedI18nSettings) : +matches[i]
  462. // If the parser can't make sense of the value, return null
  463. if (value == null) {
  464. return null
  465. }
  466. dateInfo[field] = value
  467. }
  468. if (dateInfo.isPm === 1 && dateInfo.hour != null && +dateInfo.hour !== 12) {
  469. dateInfo.hour = +dateInfo.hour + 12
  470. } else if (dateInfo.isPm === 0 && +dateInfo.hour === 12) {
  471. dateInfo.hour = 0
  472. }
  473. var dateWithoutTZ = new Date(
  474. dateInfo.year,
  475. dateInfo.month,
  476. dateInfo.day,
  477. dateInfo.hour,
  478. dateInfo.minute,
  479. dateInfo.second,
  480. dateInfo.millisecond
  481. )
  482. var validateFields = [
  483. ['month', 'getMonth'],
  484. ['day', 'getDate'],
  485. ['hour', 'getHours'],
  486. ['minute', 'getMinutes'],
  487. ['second', 'getSeconds']
  488. ]
  489. for (var j = 0, len = validateFields.length; j < len; j++) {
  490. // Check to make sure the date field is within the allowed range. Javascript dates allows values
  491. // outside the allowed range. If the values don't match the value was invalid
  492. if (
  493. specifiedFields[validateFields[j][0]] &&
  494. dateInfo[validateFields[j][0]] !== dateWithoutTZ[validateFields[j][1]]()
  495. ) {
  496. return null
  497. }
  498. }
  499. if (dateInfo.timezoneOffset == null) {
  500. return dateWithoutTZ
  501. }
  502. return new Date(
  503. Date.UTC(
  504. dateInfo.year,
  505. dateInfo.month,
  506. dateInfo.day,
  507. dateInfo.hour,
  508. dateInfo.minute - dateInfo.timezoneOffset,
  509. dateInfo.second,
  510. dateInfo.millisecond
  511. )
  512. )
  513. }
  514. /**
  515. * 格式化当前时间
  516. */
  517. function formatDate(mask = globalMasks.default, i18nSettings) {
  518. return format(new Date(), mask, i18nSettings)
  519. }
  520. /**
  521. * 格式当前时间
  522. */
  523. function parseDate(mask = globalMasks.default, i18nSettings) {
  524. return parse(formatDate(mask, i18nSettings), mask, i18nSettings)
  525. }
  526. /**
  527. * 相对时间字符串
  528. * @param {String|Number} time 时间格式字符串,或者时间
  529. * @returns {String} 相对时间字符串
  530. */
  531. function formatRelativeTime(time, mask = {}, i18nSettings) {
  532. if (!i18nSettings) {
  533. i18nSettings = function () {}
  534. }
  535. if (!time || time === null) return ''
  536. let date
  537. if (Object.prototype.toString.call(time) === '[object Date]') {
  538. date = time
  539. } else {
  540. date = !isNaN(time)
  541. ? new Date(time)
  542. : parse(time, mask['orig'] || globalMasks.default)
  543. }
  544. const timeStamp = date.getTime()
  545. // 获取当前时间时间戳
  546. const currentTime = new Date().getTime()
  547. // 判断传入时间戳是否早于当前时间戳
  548. const IS_EARLY = timeStamp <= currentTime
  549. // 获取两个时间戳差值
  550. let diff = currentTime - timeStamp
  551. // 如果IS_EARLY为false则差值取反
  552. if (!IS_EARLY) diff = -diff
  553. let resStr = ''
  554. const dirStr = IS_EARLY
  555. ? i18nSettings('ibps.time.before') || '前'
  556. : i18nSettings('ibps.time.after') || '后'
  557. if (diff < 1000) {
  558. resStr = i18nSettings('ibps.time.just') || '刚刚'
  559. } else if (diff < 60000) {
  560. // 少于等于59秒
  561. resStr =
  562. parseInt(diff / 1000) +
  563. (i18nSettings('ibps.time.seconds') || '秒') +
  564. dirStr
  565. } else if (diff >= 60000 && diff < 3600000) {
  566. // 多于59秒,少于等于59分钟59秒
  567. resStr =
  568. Math.floor(diff / 60000) +
  569. (i18nSettings('ibps.time.minutes') || '分钟') +
  570. dirStr
  571. } else if (diff >= 3600000 && diff < 86400000) {
  572. // 多于59分钟59秒,少于等于23小时59分钟59秒
  573. resStr =
  574. Math.floor(diff / 3600000) +
  575. (i18nSettings('ibps.time.hours') || '小时') +
  576. dirStr
  577. } else if (diff >= 86400000 && diff < 2623860000) {
  578. // 多于23小时59分钟59秒,少于等于29天59分钟59秒
  579. resStr =
  580. Math.floor(diff / 86400000) +
  581. (i18nSettings('ibps.time.days') || '天') +
  582. dirStr
  583. } else if (diff >= 2623860000 && diff <= 31567860000 && IS_EARLY) {
  584. // 多于29天59分钟59秒,少于364天23小时59分钟59秒,且传入的时间戳早于当前
  585. resStr = format(timeStamp, mask['day'] || 'MM-dd HH:mm')
  586. } else {
  587. resStr = format(timeStamp, mask['year'] || globalMasks.default)
  588. }
  589. return resStr
  590. }
  591. const dateDealFmt = {
  592. $dp: {
  593. has: {}
  594. },
  595. dealFmt: function (dateStr, dateFmt) {
  596. if (dateStr === '' || dateStr === null || dateStr === undefined) {
  597. return null
  598. }
  599. if (dateStr.length !== dateFmt.length) {
  600. // 格式化日期不相同
  601. const date = new Date(dateStr.replace(/-/g, '/'))
  602. if (!isNaN(date.getTime())) {
  603. return date
  604. } else {
  605. // IE
  606. const mydate = dateStr.slice(0, dateStr.indexOf('.')) // 去掉毫秒数
  607. return new Date(mydate.replace(/-/g, '/'))
  608. }
  609. }
  610. this.$dp.dateFmt = dateFmt
  611. this._setHas(/w/)
  612. this._setHas(/WW|W/)
  613. this._setHas(/DD|D/)
  614. this._setHas(/yyyy|yyy|yy|y/)
  615. this._setHas(/MMMM|MMM|MM|M/)
  616. this._setHas(/dd|d/)
  617. this._setHas(/HH|H/)
  618. this._setHas(/mm|m/)
  619. this._setHas(/ss|s/)
  620. const date = new Date()
  621. for (const p in this.$dp.has) {
  622. const has = this.$dp.has[p]
  623. if (has != null) {
  624. const val = parseInt(
  625. dateStr.substring(has.index, has.index + has[0].length),
  626. 10
  627. )
  628. if (p === 'y') {
  629. date.setYear(val)
  630. }
  631. if (p === 'M') {
  632. date.setMonth(val - 1, 1)
  633. }
  634. if (p === 'd') {
  635. date.setDate(val)
  636. }
  637. if (p === 'H') {
  638. date.setHours(val)
  639. }
  640. if (p === 'm') {
  641. date.setMinutes(val)
  642. }
  643. if (p === 's') {
  644. date.setSeconds(val)
  645. }
  646. }
  647. }
  648. return date
  649. },
  650. _setHas: function (re) {
  651. this.$dp.has[(re + '').slice(1, 2)] = re.exec(this.$dp.dateFmt)
  652. }
  653. }
  654. var fecha = {
  655. format: format,
  656. parse: parse,
  657. defaultI18n: defaultI18n,
  658. setGlobalDateI18n: setGlobalDateI18n,
  659. setGlobalDateMasks: setGlobalDateMasks,
  660. formatDate: formatDate,
  661. parseDate: parseDate,
  662. formatRelativeTime: formatRelativeTime
  663. }
  664. export default fecha
  665. export {
  666. assign,
  667. format,
  668. parse,
  669. defaultI18n,
  670. setGlobalDateI18n,
  671. setGlobalDateMasks,
  672. formatDate,
  673. parseDate,
  674. formatRelativeTime,
  675. dateDealFmt
  676. }