dateutil: correct default for Ymd in parsedate
authorJun Wu <quark@fb.com>
Mon, 25 Nov 2019 12:44:04 -0800
changeset 43781 b65bd4b61d78
parent 43780 aef7b043a36f
child 43782 79750d781928
dateutil: correct default for Ymd in parsedate The code uses `0` for the default value of Ymd (year, month, and day), which seems suboptimal. For example, these will fail to parse: dateutil.parsedate('2000', formats=dateutil.extendeddateformats) dateutil.parsedate('Jan 2000', formats=dateutil.extendeddateformats) Fix it by providing sane defaults (1 instead of 0) for year, month, and day. The suboptimal behavior was introduced by 91bc001a592 (2010-12-29, "date: fix matching of underspecified date ranges"), which does not seem to justify the current behavior. Note end-users should not notice the subtle issue, because there are no formats in `defaultdateformats` that allow an explicit year with omitted month, or an explicit month with omitted day. Differential Revision: https://phab.mercurial-scm.org/D7520
mercurial/utils/dateutil.py
--- a/mercurial/utils/dateutil.py	Mon Nov 25 12:33:06 2019 -0800
+++ b/mercurial/utils/dateutil.py	Mon Nov 25 12:44:04 2019 -0800
@@ -209,6 +209,8 @@
     True
     >>> tz == strtz
     True
+    >>> parsedate(b'2000 UTC', formats=extendeddateformats)
+    (946684800, 0)
     """
     if bias is None:
         bias = {}
@@ -244,7 +246,8 @@
                 if part[0:1] in b"HMS":
                     b = b"00"
                 else:
-                    b = b"0"
+                    # year, month, and day start from 1
+                    b = b"1"
 
             # this piece is for matching the generic end to today's date
             n = datestr(now, b"%" + part[0:1])