]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
rethinking d vs e
authorIsaac Cambron <isaac@isaaccambron.com>
Sat, 5 Oct 2013 00:28:17 +0000 (20:28 -0400)
committerIsaac Cambron <isaac@isaaccambron.com>
Sat, 5 Oct 2013 00:28:17 +0000 (20:28 -0400)
moment.js
test/moment/create.js

index fabbb7610705b629d2479615a2cb621d7e407762..b7938ec9e65488eeaf39a5598c6f59b494318ff3 100644 (file)
--- a/moment.js
+++ b/moment.js
     // note: all values past the year are optional and will default to the lowest possible value.
     // [year, month, day , hour, minute, second, millisecond]
     function dateFromConfig(config) {
-        var i, date, input = [], currentDate, yearToUse, fixYear, w, temp, lang;
+        var i, date, input = [], currentDate,
+            yearToUse, fixYear, w, temp, lang, weekday, week;
 
         if (config._d) {
             return;
             };
 
             w = config._w;
-            lang = getLangDefinition(config._l);
             if (w.GG != null || w.W != null || w.E != null) {
                 temp = dayOfYearFromWeeks(fixYear(w.GG), w.W, w.E, 4, 1);
             }
-            else if (w.d != null) {
-                temp = dayOfYearFromWeeks(fixYear(w.gg), w.w, parseWeekday(w.d, lang), 6, 0);
-            }
             else {
-                temp = dayOfYearFromWeeks(fixYear(w.gg), w.w, w.e, lang._week.doy, lang._week.dow);
+                lang = getLangDefinition(config._l);
+                weekday = w.d != null ? parseWeekday(w.d, lang) : (w.e != null ?  parseInt(w.e) + lang._week.dow : 0);
+
+                //if we're parsing 'd', then the low day numbers may be next week
+                week = w.w != null ? (w.d != null && weekday < lang._week.dow ? parseInt(w.w) + 1 : w.w) : w.w;
+
+                temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow);
             }
 
             config._a[YEAR] = temp.year;
index 9ffc0933084a05fa647b6ee47ee330d8776ed32e..7f7d37b32febe0cb473c1fe1cbc765fae5dd2409 100644 (file)
@@ -1,5 +1,17 @@
 var moment = require("../../moment");
 
+var getVerifier = function (test) {
+    return function (input, format, expected, description, asymetrical) {
+        var m = moment(input, format);
+        test.equal(m.format('YYYY MM DD'), expected, 'compare: ' + description);
+
+        //test round trip
+        if (!asymetrical) {
+            test.equal(m.format(format), input, 'round trip: ' + description);
+        }
+    }
+};
+
 exports.create = {
     "array" : function (test) {
         test.expect(8);
@@ -595,38 +607,38 @@ exports.create = {
     },
 
     "parsing week and weekday information" : function (test) {
+        var ver = getVerifier(test);
 
         //year
-        test.equal(moment('12', 'gg').format('YYYY MM DD'), "2012 01 01", 'week-year two digits');
-        test.equal(moment('2012', 'gggg').format('YYYY MM DD'), "2012 01 01", 'week-year four digits');
+        ver('12', 'gg', "2012 01 01", 'week-year two digits');
+        ver('2012', 'gggg', "2012 01 01", 'week-year four digits');
 
-        test.equal(moment('99', 'gg').format('YYYY MM DD'), "1998 12 27", 'week-year two digits previous year');
-        test.equal(moment('1999', 'gggg').format('YYYY MM DD'), "1998 12 27", 'week-year four digits previous year');
+        ver('99', 'gg', "1998 12 27", 'week-year two digits previous year');
+        ver('1999', 'gggg', "1998 12 27", 'week-year four digits previous year');
 
-        test.equal(moment('99', 'GG').format('YYYY MM DD'), "1999 01 04", 'iso week-year two digits');
-        test.equal(moment('1999', 'GGGG').format('YYYY MM DD'), "1999 01 04", 'iso week-year four digits');
+        ver('99', 'GG', "1999 01 04", 'iso week-year two digits');
+        ver('1999', 'GGGG', "1999 01 04", 'iso week-year four digits');
 
-        test.equal(moment('13', 'GG').format('YYYY MM DD'), "2012 12 31", 'iso week-year two digits previous year');
-        test.equal(moment('2013', 'GGGG').format('YYYY MM DD'), "2012 12 31", 'iso week-year four digits previous year');
+        ver('13', 'GG', "2012 12 31", 'iso week-year two digits previous year');
+        ver('2013', 'GGGG', "2012 12 31", 'iso week-year four digits previous year');
 
-        //year + week
-        test.equal(moment('1999 37', 'gggg w').format('YYYY MM DD'), "1999 09 05", 'week');
-        test.equal(moment('1999 37', 'gggg ww').format('YYYY MM DD'), "1999 09 05", 'week double');
-        test.equal(moment('1999 37', 'GGGG W').format('YYYY MM DD'), "1999 09 13", 'iso week');
-        test.equal(moment('1999 37', 'GGGG WW').format('YYYY MM DD'), "1999 09 13", 'iso week double');
+        //yer + week
+        ver('1999 37', 'gggg w', "1999 09 05", 'week');
+        ver('1999 37', 'gggg ww', "1999 09 05", 'week double');
+        ver('1999 37', 'GGGG W', "1999 09 13", 'iso week');
+        ver('1999 37', 'GGGG WW', "1999 09 13", 'iso week double');
 
-        //year + week + day
-        test.equal(moment('1999 37 4', 'GGGG WW E').format('YYYY MM DD'), "1999 09 16", 'iso day');
-        test.equal(moment('1999 37 04', 'GGGG WW E').format('YYYY MM DD'), "1999 09 16", 'iso day wide');
+        ver('1999 37 4', 'GGGG WW E', "1999 09 16", 'iso day');
+        ver('1999 37 04', 'GGGG WW E', "1999 09 16", 'iso day wide', true);
 
-        test.equal(moment('1999 37 4', 'gggg ww e').format('YYYY MM DD'), "1999 09 09", 'day');
-        test.equal(moment('1999 37 04', 'gggg ww e').format('YYYY MM DD'), "1999 09 09", 'day wide');
+        ver('1999 37 4', 'gggg ww e', "1999 09 09", 'day');
+        ver('1999 37 04', 'gggg ww e', "1999 09 09", 'day wide', true);
 
-        //d
-        test.equal(moment('1999 37 4', 'gggg ww d').format('YYYY MM DD'), "1999 09 09", 'd');
-        test.equal(moment('1999 37 Th', 'gggg ww dd').format('YYYY MM DD'), "1999 09 09", 'dd');
-        test.equal(moment('1999 37 Thu', 'gggg ww ddd').format('YYYY MM DD'), "1999 09 09", 'ddd');
-        test.equal(moment('1999 37 Thursday', 'gggg ww dddd').format('YYYY MM DD'), "1999 09 09", 'dddd');
+        //yer + week + day
+        ver('1999 37 4', 'gggg ww d', "1999 09 09", 'd');
+        ver('1999 37 Th', 'gggg ww dd', "1999 09 09", 'dd');
+        ver('1999 37 Thu', 'gggg ww ddd', "1999 09 09", 'ddd');
+        ver('1999 37 Thursday', 'gggg ww dddd', "1999 09 09", 'dddd');
 
         //lower-order only
         test.equal(moment('22', 'ww').week(), 22, "week sets the week by itself");
@@ -638,20 +650,34 @@ exports.create = {
         test.equal(moment('22', 'WW').weekYear(), moment().weekYear(), "iso week keeps this year");
 
         //order
-        test.equal(moment('6 2013 2', 'e gggg w').format('YYYY MM DD'), "2013 01 12", "order doesn't matter");
-        test.equal(moment('6 2013 2', 'E GGGG W').format('YYYY MM DD'), "2013 01 12", "iso order doesn't matter");
+        ver('6 2013 2', 'e gggg w', "2013 01 12", "order doesn't matter");
+        ver('6 2013 2', 'E GGGG W', "2013 01 12", "iso order doesn't matter");
 
         //can parse other stuff too
-        test.equals(moment('1999-W37-4 3:30', 'GGGG-[W]WW-E HH:mm').format('YYYY MM DD HH:mm'), '1999 09 16 03:30', "parsing weeks and hours");
+        test.equal(moment('1999-W37-4 3:30', 'GGGG-[W]WW-E HH:mm').format('YYYY MM DD HH:mm'), '1999 09 16 03:30', "parsing weeks and hours");
 
         test.done();
     },
 
     'parsing localized weekdays' : function (test) {
+        var ver = getVerifier(test);
         try {
-            moment.lang('fr');
-            test.equal(moment('1999 37 4', 'gggg ww e').format('YYYY MM DD'), "1999 09 16", 'localized e uses local doy and dow');
-            test.equal(moment('1999 37 4', 'gggg ww d').format('YYYY MM DD'), "1999 09 09", 'localized d ignores lang entirely');
+            moment.lang('fr'); //french uses doy = 4, dow = 1
+            ver('1999 37 4', 'GGGG WW E', "1999 09 16", 'iso ignores language');
+            ver('1999 37 7', 'GGGG WW E', "1999 09 19", 'iso ignores language');
+
+            ver('1999 37 0', 'gggg ww e', "1999 09 13", 'localized e uses local doy and dow: 0 = monday');
+            ver('1999 37 4', 'gggg ww e', "1999 09 17", 'localized e uses local doy and dow: 4 = friday');
+
+            ver('1999 37 1', 'gggg ww d', "1999 09 13", 'localized d uses 0-indexed days: 1 = monday');
+            ver('1999 37 Lu', 'gggg ww dd', "1999 09 13", 'localized d uses 0-indexed days: Mo');
+            ver('1999 37 lun.', 'gggg ww ddd', "1999 09 13", 'localized d uses 0-indexed days: Mon');
+            ver('1999 37 lundi', 'gggg ww dddd', "1999 09 13", 'localized d uses 0-indexed days: Monday');
+            ver('1999 37 4', 'gggg ww d', "1999 09 16", 'localized d uses 0-indexed days: 4');
+
+            //sunday goes at the end of the week
+            ver('1999 37 0', 'gggg ww d', "1999 09 19", 'localized d uses 0-indexed days: 0 = sund');
+            ver('1999 37 Di', 'gggg ww dd', "1999 09 19", 'localized d uses 0-indexed days: 0 = sund');
         }
         finally {
             moment.lang('en');