diff --git a/src/constant.js b/src/constant.js index 22d6e8adc..08e91a6a6 100644 --- a/src/constant.js +++ b/src/constant.js @@ -27,4 +27,4 @@ export const INVALID_DATE_STRING = 'Invalid Date' // regex export const REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/ -export const REGEX_FORMAT = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g +export const REGEX_FORMAT = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|S{1,3}/g diff --git a/src/index.js b/src/index.js index 061ade178..91682e1f6 100644 --- a/src/index.js +++ b/src/index.js @@ -328,6 +328,10 @@ class Dayjs { return String(this.$s) case 'ss': return Utils.s(this.$s, 2, '0') + case 'S': + return String(Math.round(this.$ms / 100)) + case 'SS': + return Utils.s(Math.round(this.$ms / 10), 2, '0') case 'SSS': return Utils.s(this.$ms, 3, '0') case 'Z': diff --git a/src/plugin/customParseFormat/index.js b/src/plugin/customParseFormat/index.js index c7082833c..6d1bdb802 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|Q|YYYY|YY?|ww?|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?|SS?S?|z|ZZ?)/g const match1 = /\d/ // 0 - 9 const match2 = /\d\d/ // 00 - 99 diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index e2060c344..e3d8de378 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -180,6 +180,8 @@ class Duration { mm: $u.s(this.$d.minutes, 2, '0'), s: this.$d.seconds, ss: $u.s(this.$d.seconds, 2, '0'), + S: String(Math.round(this.$d.milliseconds / 100)), + SS: $u.s(Math.round(this.$d.milliseconds / 10), 2, '0'), SSS: $u.s(this.$d.milliseconds, 3, '0') } return str.replace(REGEX_FORMAT, (match, $1) => $1 || String(matches[match])) diff --git a/test/plugin/customParseFormat.test.js b/test/plugin/customParseFormat.test.js index fb4030176..dffabfe38 100644 --- a/test/plugin/customParseFormat.test.js +++ b/test/plugin/customParseFormat.test.js @@ -460,3 +460,21 @@ it('parse w, ww', () => { const format2 = 'YYYY-[w]ww' expect(dayjs(input2, format2).format(format1)).toBe(input2) }) + +describe('parse milliseconds', () => { + it('S', () => { + const input = '2024-01-01T00:00:00.1' + const format1 = 'YYYY-MM-DDTHH:mm:ss.S' + expect(dayjs(input, format1, true).format(format1)).toBe(input) + }) + it('SS', () => { + const input = '2024-01-01T00:00:00.12' + const format1 = 'YYYY-MM-DDTHH:mm:ss.SS' + expect(dayjs(input, format1, true).format(format1)).toBe(input) + }) + it('SSS', () => { + const input = '2024-01-01T00:00:00.123' + const format1 = 'YYYY-MM-DDTHH:mm:ss.SSS' + expect(dayjs(input, format1, true).format(format1)).toBe(input) + }) +}) diff --git a/test/plugin/duration.test.js b/test/plugin/duration.test.js index 3e726af91..4ed572fc5 100644 --- a/test/plugin/duration.test.js +++ b/test/plugin/duration.test.js @@ -305,7 +305,7 @@ describe('Format', () => { .add(9, 'months') .add(2, 'years') .add(10, 'milliseconds') - expect(d.format('Y/YY.YYYYTESTM:MM:D:DD:H:HH:m:mm:s:ss:SSS')) + expect(d.format('Y/YY.YYYY[TEST]M:MM:D:DD:H:HH:m:mm:s:ss:SSS')) .toBe('2/02.0002TEST9:09:6:06:8:08:5:05:1:01:010') }) })