# [egenix-users] At what year does (yy, mm, dd) become (19yy, mm, dd)?

M.-A. Lemburg mal at egenix.com
Wed May 7 17:04:22 CEST 2008

```On 2008-05-07 15:56, Dick Moores wrote:
> On Wed, May 7, 2008 at 4:36 AM, M.-A. Lemburg <mal at egenix.com> wrote:
>> On 2008-05-07 12:09, Dick Moores wrote:
>>> For mxDateTime.
>>>
>>> I know I saw this in the manual, but I can't locate it again.
>>    Note about the Y2K problems:
>>
>>       The parser can only handle years with at least 2 digits. 2
>>       digit year values get expanded by adding the century using
>>       DateTime.add_century(), while 3 digit year get converted
>>       literally. To have 2 digit years also be interpreted literally,
>>       add leading zeros, e.g. year 99 must be written as 099 or 0099.
>>
>>
>>    """ Sliding window approach to the Y2K problem: adds a suitable
>>        century to the given year and returns it as integer.
>>
>>        The window used depends on the current year (at import time).
>>        If adding the current century to the given year gives a year
>>        within the range current_year-70...current_year+30 [both
>>        inclusive], then the current century is added. Otherwise the
>>        century (current + 1 or - 1) producing the smallest difference is
>>        chosen.
>
> Sorry, but I can't follow that. Please give some examples. From my own
> testing, I can see that for current year 2008, if 2-digit years are
> represented by yy, then if yy <= 38, the century is the 21st (20yy).
> Whereas if yy > 39, the century is the 20th (19yy). But I don't
> understand what happens when the current year changes. Please
> illustrate your rule with some well-chosen examples.
>
> Examples for my narrow rule:  (38, 1, 1) -> (2038, 01, 01);  (39, 1,
> 1) -> (1939, 01, 01);  (87, 12, 31) -> (1987, 12, 31);  (01, 9, 11) ->
> (2001, 09, 11)

Those two snippets were taken from Parser.py and DateTime.py.

on the algorithm. This function is always called when the parser
finds that a two-digit year was used, regardless of the month and
day:

_current_year = now().year
_current_century, _current_year_in_century = divmod(_current_year, 100)
_current_century = _current_century * 100

current_year=_current_year,
current_century=_current_century):

""" Sliding window approach to the Y2K problem: adds a suitable
century to the given year and returns it as integer.

The window used depends on the current year (at import time).
If adding the current century to the given year gives a year
within the range current_year-70...current_year+30 [both
inclusive], then the current century is added. Otherwise the
century (current + 1 or - 1) producing the smallest difference is
chosen.

"""
if year > 99:
# Take it as-is
return year
year = year + current_century
diff = year - current_year
if diff >= -70 and diff <= 30:
return year
elif diff < -70:
return year + 100
else:
return year - 100

--
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Source  (#1, May 07 2008)
>>> Python/Zope Consulting and Support ...        http://www.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ...        http://python.egenix.com/
________________________________________________________________________