From c6afead8fcbc307239ea79c00a014b54a591f8e5 Mon Sep 17 00:00:00 2001 From: Garreau Arthur Date: Wed, 29 Aug 2018 17:25:10 +0200 Subject: [PATCH 1/3] Introducing Multiple Locale Support This commit introduces the following new formats: * LT * LTS * L * LL * LLL * LLLL These tokens define shortcuts to usual, local specific, formats. Example: dayjs().format('LL'); // August 29, 2018 --- src/constant.js | 2 +- src/index.js | 32 ++++++++++++++++++++++++++++++++ src/locale/fr.js | 10 +++++++++- test/display.test.js | 9 +++++++++ test/testFrenchSUPPRIMER.js | 11 +++++++++++ 5 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 test/testFrenchSUPPRIMER.js diff --git a/src/constant.js b/src/constant.js index 9b44afdaa..9e0b47072 100644 --- a/src/constant.js +++ b/src/constant.js @@ -25,7 +25,7 @@ export const FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ' // regex export const REGEX_PARSE = /^(\d{4})-?(\d{1,2})-?(\d{0,2})(.*?(\d{1,2}):(\d{1,2}):(\d{1,2}))?.?(\d{1,3})?$/ -export const REGEX_FORMAT = /\[.*?\]|Y{2,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{2,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}|(LTS|LT|LL?L?L?|l{1,4})|SSS/g export const en = { name: 'en', diff --git a/src/index.js b/src/index.js index e34a920ff..2c9c517b7 100644 --- a/src/index.js +++ b/src/index.js @@ -280,6 +280,19 @@ class Dayjs { const { weekdays, months } = locale + + let { longDateFormat } = locale + if (longDateFormat === undefined) { + longDateFormat = { + LTS: 'h:mm:ss A', + LT: 'h:mm A', + L: 'MM/DD/YYYY', + LL: 'MMMM D, YYYY', + LLL: 'MMMM D, YYYY h:mm A', + LLLL: 'dddd, MMMM D, YYYY h:mm A' + } + } + const getShort = (arr, index, full, length) => ( (arr && arr[index]) || full[index].substr(0, length) ) @@ -334,6 +347,25 @@ class Dayjs { return Utils.padStart(this.$ms, 3, '0') case 'Z': return zoneStr + + case 'LT': + case 'lt': + return this.format(longDateFormat.LT) + case 'LTS': + case 'lts': + return this.format(longDateFormat.LTS) + case 'L': + case 'l': + return this.format(longDateFormat.L) + case 'LL': + case 'll': + return this.format(longDateFormat.LL) + case 'LLL': + case 'lll': + return this.format(longDateFormat.LLL) + case 'LLLL': + case 'llll': + return this.format(longDateFormat.LLLL) default: // 'ZZ' return zoneStr.replace(':', '') } diff --git a/src/locale/fr.js b/src/locale/fr.js index aebfc6701..bbbc1e9ab 100644 --- a/src/locale/fr.js +++ b/src/locale/fr.js @@ -19,7 +19,15 @@ const locale = { y: 'un an', yy: '%d ans' }, - ordinal: n => `${n}º` + ordinal: n => `${n}º`, + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd D MMMM YYYY HH:mm' + } } dayjs.locale(locale, null, true) diff --git a/test/display.test.js b/test/display.test.js index 29024b9f3..32787bef3 100644 --- a/test/display.test.js +++ b/test/display.test.js @@ -114,6 +114,15 @@ it('Format Escaping characters', () => { expect(dayjs().format(string)).toBe(moment().format(string)) }) +it('Format Month LTS LT L LL LLL LLLL', () => { + expect(dayjs().format('LTS')).toBe(moment().format('LTS')) + expect(dayjs().format('LT')).toBe(moment().format('LT')) + expect(dayjs().format('L')).toBe(moment().format('L')) + expect(dayjs().format('LL')).toBe(moment().format('LL')) + expect(dayjs().format('LLL')).toBe(moment().format('LLL')) + expect(dayjs().format('LLLL')).toBe(moment().format('LLLL')) +}) + describe('Difference', () => { it('empty -> default milliseconds', () => { const dateString = '20110101' diff --git a/test/testFrenchSUPPRIMER.js b/test/testFrenchSUPPRIMER.js new file mode 100644 index 000000000..c4f09bd1f --- /dev/null +++ b/test/testFrenchSUPPRIMER.js @@ -0,0 +1,11 @@ +import dayjs from '../src' +import '../src/locale/fr' // load on demand + +dayjs.locale('fr') // use Spanish locale globally + +console.log(dayjs().format('LTS')) +console.log(dayjs().format('LT')) +console.log(dayjs().format('L')) +console.log(dayjs().format('LL')) +console.log(dayjs().format('LLL')) +console.log(dayjs().format('LLLL')) From 3c249971fe2ac3885fa642cca04fd5a09a46d3b0 Mon Sep 17 00:00:00 2001 From: Garreau Arthur Date: Thu, 30 Aug 2018 10:48:28 +0200 Subject: [PATCH 2/3] Adds long date format to the Spanish locale and adds tests to display.test.js This commit adds the "long date format" object in src/locale/es.js to allow to use the new LT, LTS, L, LL, LLL, LLLL formats. These new formats are tested in test/display.test.js --- src/locale/es.js | 10 +++++++++- test/display.test.js | 22 +++++++++++++++++++++- test/testFrenchSUPPRIMER.js | 11 ----------- 3 files changed, 30 insertions(+), 13 deletions(-) delete mode 100644 test/testFrenchSUPPRIMER.js diff --git a/src/locale/es.js b/src/locale/es.js index 58312ea33..84959fb7e 100644 --- a/src/locale/es.js +++ b/src/locale/es.js @@ -19,7 +19,15 @@ const locale = { y: 'un año', yy: '%d años' }, - ordinal: n => `${n}º` + ordinal: n => `${n}º`, + longDateFormat: { + LT: 'H:mm', + LTS: 'H:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D [de] MMMM [de] YYYY', + LLL: 'D [de] MMMM [de] YYYY H:mm', + LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm' + } } dayjs.locale(locale, null, true) diff --git a/test/display.test.js b/test/display.test.js index 32787bef3..f51940cf0 100644 --- a/test/display.test.js +++ b/test/display.test.js @@ -2,6 +2,8 @@ import moment from 'moment' import MockDate from 'mockdate' import dayjs from '../src' import th from '../src/locale/th' +import fr from '../src/locale/fr' +import es from '../src/locale/es' beforeEach(() => { MockDate.set(new Date()) @@ -114,7 +116,7 @@ it('Format Escaping characters', () => { expect(dayjs().format(string)).toBe(moment().format(string)) }) -it('Format Month LTS LT L LL LLL LLLL', () => { +it('Format LTS LT L LL LLL LLLL', () => { expect(dayjs().format('LTS')).toBe(moment().format('LTS')) expect(dayjs().format('LT')).toBe(moment().format('LT')) expect(dayjs().format('L')).toBe(moment().format('L')) @@ -123,6 +125,24 @@ it('Format Month LTS LT L LL LLL LLLL', () => { expect(dayjs().format('LLLL')).toBe(moment().format('LLLL')) }) +it('French LTS, LT, L, LL, LLL, LLLL', () => { + expect(dayjs().locale('fr').format('LTS')).toBe(moment().locale('fr').format('LTS')) + expect(dayjs().locale('fr').format('LT')).toBe(moment().locale('fr').format('LT')) + expect(dayjs().locale('fr').format('L').toLowerCase()).toBe(moment().locale('fr').format('L')) + expect(dayjs().locale('fr').format('LL').toLowerCase()).toBe(moment().locale('fr').format('LL')) + expect(dayjs().locale('fr').format('LLL').toLowerCase()).toBe(moment().locale('fr').format('LLL')) + expect(dayjs().locale('fr').format('LLLL').toLowerCase()).toBe(moment().locale('fr').format('LLLL')) +}) + +it('Spanish LTS, LT, L, LL, LLL, LLLL', () => { + expect(dayjs().locale('es').format('LTS')).toBe(moment().locale('es').format('LTS')) + expect(dayjs().locale('es').format('LT')).toBe(moment().locale('es').format('LT')) + expect(dayjs().locale('es').format('L')).toBe(moment().locale('es').format('L')) + expect(dayjs().locale('es').format('LL').toLowerCase()).toBe(moment().locale('es').format('LL').toLowerCase()) + expect(dayjs().locale('es').format('LLL').toLowerCase()).toBe(moment().locale('es').format('LLL').toLowerCase()) + expect(dayjs().locale('es').format('LLLL').toLowerCase()).toBe(moment().locale('es').format('LLLL').toLowerCase()) +}) + describe('Difference', () => { it('empty -> default milliseconds', () => { const dateString = '20110101' diff --git a/test/testFrenchSUPPRIMER.js b/test/testFrenchSUPPRIMER.js deleted file mode 100644 index c4f09bd1f..000000000 --- a/test/testFrenchSUPPRIMER.js +++ /dev/null @@ -1,11 +0,0 @@ -import dayjs from '../src' -import '../src/locale/fr' // load on demand - -dayjs.locale('fr') // use Spanish locale globally - -console.log(dayjs().format('LTS')) -console.log(dayjs().format('LT')) -console.log(dayjs().format('L')) -console.log(dayjs().format('LL')) -console.log(dayjs().format('LLL')) -console.log(dayjs().format('LLLL')) From c754f99cbee945b06abd7f62607384a1d31bcffb Mon Sep 17 00:00:00 2001 From: Garreau Arthur Date: Thu, 30 Aug 2018 10:55:58 +0200 Subject: [PATCH 3/3] fix test --- test/display.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/display.test.js b/test/display.test.js index f51940cf0..71fd70d81 100644 --- a/test/display.test.js +++ b/test/display.test.js @@ -2,8 +2,8 @@ import moment from 'moment' import MockDate from 'mockdate' import dayjs from '../src' import th from '../src/locale/th' -import fr from '../src/locale/fr' -import es from '../src/locale/es' +import '../src/locale/fr' +import '../src/locale/es' beforeEach(() => { MockDate.set(new Date())