From 0fce088830b264c7137a28179053b8df4a312f30 Mon Sep 17 00:00:00 2001 From: Iskren Chernev Date: Mon, 26 Oct 2015 01:17:31 -0700 Subject: [PATCH] Add hmm and hmmss formatting tokens Fixes #2418 --- src/lib/format/format.js | 2 +- src/lib/parse/regex.js | 2 ++ src/lib/units/hour.js | 37 +++++++++++++++++++++++++++++++++---- src/test/moment/create.js | 17 +++++++++++++++++ src/test/moment/format.js | 10 ++++++++++ 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/src/lib/format/format.js b/src/lib/format/format.js index 5378170b1..6c1e46d58 100644 --- a/src/lib/format/format.js +++ b/src/lib/format/format.js @@ -1,6 +1,6 @@ import zeroFill from '../utils/zero-fill'; -export var formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; +export var formattingTokens = /(\[[^\[]*\])|(\\)?(hmmss|hmm|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; diff --git a/src/lib/parse/regex.js b/src/lib/parse/regex.js index b1ace2763..9541f039c 100644 --- a/src/lib/parse/regex.js +++ b/src/lib/parse/regex.js @@ -4,6 +4,8 @@ export var match3 = /\d{3}/; // 000 - 999 export var match4 = /\d{4}/; // 0000 - 9999 export var match6 = /[+-]?\d{6}/; // -999999 - 999999 export var match1to2 = /\d\d?/; // 0 - 99 +export var match3to4 = /\d\d\d\d?/; // 999 - 9999 +export var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 export var match1to3 = /\d{1,3}/; // 0 - 999 export var match1to4 = /\d{1,4}/; // 0 - 9999 export var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 diff --git a/src/lib/units/hour.js b/src/lib/units/hour.js index 356c74d23..a21757300 100644 --- a/src/lib/units/hour.js +++ b/src/lib/units/hour.js @@ -1,17 +1,29 @@ import { makeGetSet } from '../moment/get-set'; import { addFormatToken } from '../format/format'; import { addUnitAlias } from './aliases'; -import { addRegexToken, match1to2, match2 } from '../parse/regex'; +import { addRegexToken, match1to2, match2, match3to4, match5to6 } from '../parse/regex'; import { addParseToken } from '../parse/token'; -import { HOUR } from './constants'; +import { HOUR, MINUTE, SECOND } from './constants'; import toInt from '../utils/to-int'; +import zeroFill from '../utils/zero-fill'; import getParsingFlags from '../create/parsing-flags'; // FORMATTING -addFormatToken('H', ['HH', 2], 0, 'hour'); -addFormatToken('h', ['hh', 2], 0, function () { +function hFormat() { return this.hours() % 12 || 12; +} + +addFormatToken('H', ['HH', 2], 0, 'hour'); +addFormatToken('h', ['hh', 2], 0, hFormat); + +addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); +}); + +addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); }); function meridiem (token, lowercase) { @@ -40,6 +52,9 @@ addRegexToken('h', match1to2); addRegexToken('HH', match1to2, match2); addRegexToken('hh', match1to2, match2); +addRegexToken('hmm', match3to4); +addRegexToken('hmmss', match5to6); + addParseToken(['H', 'HH'], HOUR); addParseToken(['a', 'A'], function (input, array, config) { config._isPm = config._locale.isPM(input); @@ -49,6 +64,20 @@ addParseToken(['h', 'hh'], function (input, array, config) { array[HOUR] = toInt(input); getParsingFlags(config).bigHour = true; }); +addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; +}); +addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; +}); // LOCALES diff --git a/src/test/moment/create.js b/src/test/moment/create.js index 425c47ed1..7d4670a1e 100644 --- a/src/test/moment/create.js +++ b/src/test/moment/create.js @@ -1000,3 +1000,20 @@ test('milliseconds', function (assert) { assert.equal(moment('12345678', 'SSSSSSSS').millisecond(), 123); assert.equal(moment('123456789', 'SSSSSSSSS').millisecond(), 123); }); + +test('hmm', function (assert) { + assert.equal(moment('123', 'hmm', true).format('HH:mm:ss'), '01:23:00', '123 with hmm'); + assert.equal(moment('123a', 'hmmA', true).format('HH:mm:ss'), '01:23:00', '123a with hmmA'); + assert.equal(moment('123p', 'hmmA', true).format('HH:mm:ss'), '13:23:00', '123p with hmmA'); + + assert.equal(moment('1234', 'hmm', true).format('HH:mm:ss'), '12:34:00', '1234 with hmm'); + assert.equal(moment('1234a', 'hmmA', true).format('HH:mm:ss'), '00:34:00', '1234a with hmmA'); + assert.equal(moment('1234p', 'hmmA', true).format('HH:mm:ss'), '12:34:00', '1234p with hmmA'); + + assert.equal(moment('12345', 'hmmss', true).format('HH:mm:ss'), '01:23:45', '12345 with hmmss'); + assert.equal(moment('12345a', 'hmmssA', true).format('HH:mm:ss'), '01:23:45', '12345a with hmmssA'); + assert.equal(moment('12345p', 'hmmssA', true).format('HH:mm:ss'), '13:23:45', '12345p with hmmssA'); + assert.equal(moment('112345', 'hmmss', true).format('HH:mm:ss'), '11:23:45', '112345 with hmmss'); + assert.equal(moment('112345a', 'hmmssA', true).format('HH:mm:ss'), '11:23:45', '112345a with hmmssA'); + assert.equal(moment('112345p', 'hmmssA', true).format('HH:mm:ss'), '23:23:45', '112345p with hmmssA'); +}); diff --git a/src/test/moment/format.js b/src/test/moment/format.js index 016f6d17f..f12a62ce6 100644 --- a/src/test/moment/format.js +++ b/src/test/moment/format.js @@ -371,3 +371,13 @@ test('milliseconds', function (assert) { assert.equal(m.format('SSSSSSSS'), '12300000'); assert.equal(m.format('SSSSSSSSS'), '123000000'); }); + +test('hmm and hmmss', function (assert) { + assert.equal(moment('12:34:56', 'HH:mm:ss').format('hmm'), '1234'); + assert.equal(moment('01:34:56', 'HH:mm:ss').format('hmm'), '134'); + assert.equal(moment('13:34:56', 'HH:mm:ss').format('hmm'), '134'); + + assert.equal(moment('12:34:56', 'HH:mm:ss').format('hmmss'), '123456'); + assert.equal(moment('01:34:56', 'HH:mm:ss').format('hmmss'), '13456'); + assert.equal(moment('13:34:56', 'HH:mm:ss').format('hmmss'), '13456'); +}); -- 2.47.2