]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
Add parsed date parts array to parsing flags. Add meridiem to parsing flags. Change...
authormaggie@tempworks.com <maggie@tempworks.com>
Wed, 16 Mar 2016 04:32:32 +0000 (23:32 -0500)
committerIskren Chernev <iskren.chernev@gmail.com>
Sat, 16 Apr 2016 05:48:54 +0000 (22:48 -0700)
src/lib/create/from-string-and-format.js
src/lib/create/parsing-flags.js
src/lib/create/valid.js
src/lib/utils/some.js [new file with mode: 0644]
src/test/moment/create.js

index 87eecafb3cdd499c8d26ea0c51c8f038dcf4fd24..bbaab0de31740d7ce1e72616b6513665a39baf6b 100644 (file)
@@ -70,6 +70,9 @@ export function configFromStringAndFormat(config) {
             config._a[HOUR] > 0) {
         getParsingFlags(config).bigHour = undefined;
     }
+
+    getParsingFlags(config).parsedDateParts = config._a.slice(0);
+    getParsingFlags(config).meridiem = config._meridiem;
     // handle meridiem
     config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
 
index 2bfbcb3414c5c2955cddc0d37a97d3168b63bfd2..5a4220013a37d7bdee2566d33598845f5ab7f391 100644 (file)
@@ -10,7 +10,9 @@ function defaultParsingFlags() {
         invalidMonth    : null,
         invalidFormat   : false,
         userInvalidated : false,
-        iso             : false
+        iso             : false,
+        parsedDateParts : [],
+        meridiem        : null
     };
 }
 
index ad56bfe063bc6d285455268d7e6174364bbc5e08..4c621168cad8a71f15f34fee4d14d3903de21583 100644 (file)
@@ -1,10 +1,14 @@
 import extend from '../utils/extend';
 import { createUTC } from './utc';
 import getParsingFlags from '../create/parsing-flags';
+import some from '../utils/some';
 
 export function isValid(m) {
     if (m._isValid == null) {
         var flags = getParsingFlags(m);
+        var parsedParts = some.call(flags.parsedDateParts, function (i) {
+            return i != null;
+        });
         m._isValid = !isNaN(m._d.getTime()) &&
             flags.overflow < 0 &&
             !flags.empty &&
@@ -12,7 +16,8 @@ export function isValid(m) {
             !flags.invalidWeekday &&
             !flags.nullInput &&
             !flags.invalidFormat &&
-            !flags.userInvalidated;
+            !flags.userInvalidated &&
+            (!flags.meridiem || (flags.meridiem && parsedParts));
 
         if (m._strict) {
             m._isValid = m._isValid &&
diff --git a/src/lib/utils/some.js b/src/lib/utils/some.js
new file mode 100644 (file)
index 0000000..1bd3186
--- /dev/null
@@ -0,0 +1,19 @@
+var some;
+if (Array.prototype.some) {
+    some = Array.prototype.some;
+} else {
+    some = function (fun) {
+        var t = Object(this);
+        var len = t.length >>> 0;
+
+        for (var i = 0; i < len; i++) {
+            if (i in t && fun.call(this, t[i], i, t)) {
+                return true;
+            }
+        }
+
+        return false;
+    };
+}
+
+export { some as default };
index 2af09d21365b5bc4bf43c57aa0d1f1c5c11eb122..4b5f2a1d216f5b3f4b56bfd73dbefee202eef344 100644 (file)
@@ -1043,3 +1043,19 @@ test('hmm', function (assert) {
 test('Y token', function (assert) {
     assert.equal(moment('1-1-2010', 'M-D-Y', true).year(), 2010, 'parsing Y');
 });
+
+test('parsing flags retain parsed date parts', function (assert) {
+    var a = moment('10 p', 'hh:mm a');
+    assert.equal(a.parsingFlags().parsedDateParts[3], 10, 'parsed 10 as the hour');
+    assert.equal(a.parsingFlags().parsedDateParts[0], undefined, 'year was not parsed');
+    assert.equal(a.parsingFlags().meridiem, 'p', 'meridiem flag was added');
+    var b = moment('10:30', ['MMDDYY', 'HH:mm']);
+    assert.equal(b.parsingFlags().parsedDateParts[3], 10, 'multiple format parshing matched hour');
+    assert.equal(b.parsingFlags().parsedDateParts[0], undefined, 'array is properly copied, no residual data from first token parse');
+});
+
+test('parsing only meridiem results in invalid date', function (assert) {
+    assert.ok(!moment('alkj', 'hh:mm a').isValid(), 'because an a token is used, a meridiem will be parsed but nothing else was so invalid');
+    assert.ok(moment('02:30 p more extra stuff', 'hh:mm a').isValid(), 'because other tokens were parsed, date is valid');
+    assert.ok(moment('1/1/2016 extra data', ['a', 'M/D/YYYY']).isValid(), 'took second format, does not pick up on meridiem parsed from first format (good copy)');
+});