diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a594fd35..5b16f3b90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ * add UTC support to negativeYear plugin ([#2692](https://github.com/iamkun/dayjs/issues/2692)) ([f3ef705](https://github.com/iamkun/dayjs/commit/f3ef705613af83333fe132b470896a65e12f31b0)) * Fix zero offset issue when use tz with locale ([#2532](https://github.com/iamkun/dayjs/issues/2532)) ([d0e6738](https://github.com/iamkun/dayjs/commit/d0e6738a66e1b65d3706aad2f9168ebb43d4f887)) * Improve typing for min/max plugin ([#2573](https://github.com/iamkun/dayjs/issues/2573)) ([4fbe94a](https://github.com/iamkun/dayjs/commit/4fbe94aaba8c815a42cf4d23dabac918ec50e68c)) -* timezone plugin currect parse UTC tz ([#2693](https://github.com/iamkun/dayjs/issues/2693)) ([b575c81](https://github.com/iamkun/dayjs/commit/b575c81a8c9c85c7a0baf6f608a12f9d3ba95bd1)) +* timezone plugin correct parse UTC tz ([#2693](https://github.com/iamkun/dayjs/issues/2693)) ([b575c81](https://github.com/iamkun/dayjs/commit/b575c81a8c9c85c7a0baf6f608a12f9d3ba95bd1)) ## [1.11.11](https://github.com/iamkun/dayjs/compare/v1.11.10...v1.11.11) (2024-04-28) diff --git a/README.md b/README.md index 74d88057e..9247b6e75 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,10 @@ Support this project by becoming a sponsor. Your logo will show up here with a l          + + + +         @@ -142,6 +146,10 @@ Support this project by becoming a sponsor. Your logo will show up here with a l BestKru +         + + Route Optimizer and Route Planner Software + ## Contributors diff --git a/docs/demo/index.js b/docs/demo/index.js index 4299e3013..7c6951e62 100644 --- a/docs/demo/index.js +++ b/docs/demo/index.js @@ -7,3 +7,6 @@ dayjs('2018-08-08').format() // format dayjs().format('YYYY-MM-DD') + +// locale +dayjs().locale('zh-cn').format() diff --git a/src/plugin/customParseFormat/index.js b/src/plugin/customParseFormat/index.js index 771d13106..c7082833c 100644 --- a/src/plugin/customParseFormat/index.js +++ b/src/plugin/customParseFormat/index.js @@ -1,6 +1,6 @@ import { u } from '../localizedFormat/utils' -const formattingTokens = /(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g +const formattingTokens = /(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g const match1 = /\d/ // 0 - 9 const match2 = /\d\d/ // 00 - 99 @@ -66,6 +66,9 @@ const expressions = { a: [matchWord, function (input) { this.afternoon = meridiemMatch(input, true) }], + Q: [match1, function (input) { + this.month = ((input - 1) * 3) + 1 + }], S: [match1, function (input) { this.milliseconds = +input * 100 }], @@ -95,6 +98,8 @@ const expressions = { } } }], + w: [match1to2, addInput('week')], + ww: [match2, addInput('week')], M: [match1to2, addInput('month')], MM: [match2, addInput('month')], MMM: [matchWord, function (input) { @@ -173,12 +178,12 @@ function makeParser(format) { } } -const parseFormattedInput = (input, format, utc) => { +const parseFormattedInput = (input, format, utc, dayjs) => { try { if (['x', 'X'].indexOf(format) > -1) return new Date((format === 'X' ? 1000 : 1) * input) const parser = makeParser(format) const { - year, month, day, hours, minutes, seconds, milliseconds, zone + year, month, day, hours, minutes, seconds, milliseconds, zone, week } = parser(input) const now = new Date() const d = day || ((!year && !month) ? now.getDate() : 1) @@ -197,7 +202,12 @@ const parseFormattedInput = (input, format, utc) => { if (utc) { return new Date(Date.UTC(y, M, d, h, m, s, ms)) } - return new Date(y, M, d, h, m, s, ms) + let newDate + newDate = new Date(y, M, d, h, m, s, ms) + if (week) { + newDate = dayjs(newDate).week(week).toDate() + } + return newDate } catch (e) { return new Date('') // Invalid Date } @@ -224,12 +234,12 @@ export default (o, C, d) => { const isStrictWithLocale = args[3] === true const isStrict = isStrictWithoutLocale || isStrictWithLocale let pl = args[2] - if (isStrictWithLocale) [,, pl] = args + if (isStrictWithLocale) [, , pl] = args locale = this.$locale() if (!isStrictWithoutLocale && pl) { locale = d.Ls[pl] } - this.$d = parseFormattedInput(date, format, utc) + this.$d = parseFormattedInput(date, format, utc, d) this.init() if (pl && pl !== true) this.$L = this.locale(pl).$L // use != to treat diff --git a/test/plugin/customParseFormat.test.js b/test/plugin/customParseFormat.test.js index a4588e976..fb4030176 100644 --- a/test/plugin/customParseFormat.test.js +++ b/test/plugin/customParseFormat.test.js @@ -7,9 +7,11 @@ import '../../src/locale/zh-cn' import customParseFormat from '../../src/plugin/customParseFormat' import advancedFormat from '../../src/plugin/advancedFormat' import localizedFormats from '../../src/plugin/localizedFormat' +import weekOfYear from '../../src/plugin/weekOfYear' dayjs.extend(customParseFormat) dayjs.extend(localizedFormats) +dayjs.extend(weekOfYear) // test parse w, ww beforeEach(() => { MockDate.set(new Date()) @@ -437,3 +439,24 @@ it('parse X x', () => { dayjs.extend(advancedFormat) expect(dayjs(input2, format2, true).valueOf()).toBe(moment(input2, format2, true).valueOf()) }) + +it('parse Q, [Q]', () => { + const input1 = '2024-Q1' + const input2 = '2024-Q2' + const input3 = '2024-Q3' + const input4 = '2024-Q4' + const format = 'YYYY-[Q]Q' + expect(dayjs(input1, format).valueOf()).toBe(moment(input1, format).valueOf()) + expect(dayjs(input2, format).valueOf()).toBe(moment(input2, format).valueOf()) + expect(dayjs(input3, format).valueOf()).toBe(moment(input3, format).valueOf()) + expect(dayjs(input4, format).valueOf()).toBe(moment(input4, format).valueOf()) +}) + +it('parse w, ww', () => { + const input = '2024-w1' + const format1 = 'YYYY-[w]w' + expect(dayjs(input, format1).format(format1)).toBe(input) + const input2 = '2024-w32' + const format2 = 'YYYY-[w]ww' + expect(dayjs(input2, format2).format(format1)).toBe(input2) +})