Commit 2af75b48 authored by Jacob Kaplan-Moss's avatar Jacob Kaplan-Moss
Browse files

Fixed #10825: fixed the 'U' format code to dateformat (and the date/now...

Fixed #10825: fixed the 'U' format code to dateformat (and the date/now filter/tag). Thanks to gsong and mir.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10716 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent f7d01c49
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -11,12 +11,13 @@ Usage:
>>>
"""

import re
import time
import calendar
from django.utils.dates import MONTHS, MONTHS_3, MONTHS_AP, WEEKDAYS, WEEKDAYS_ABBR
from django.utils.tzinfo import LocalTimezone
from django.utils.translation import ugettext as _
from django.utils.encoding import force_unicode
from calendar import isleap, monthrange
import re, time

re_formatchars = re.compile(r'(?<!\\)([aAbBdDfFgGhHiIjlLmMnNOPrsStTUwWyYzZ])')
re_escaped = re.compile(r'\\(.)')
@@ -146,7 +147,7 @@ class DateFormat(TimeFormat):

    def L(self):
        "Boolean for whether it is a leap year; i.e. True or False"
        return isleap(self.data.year)
        return calendar.isleap(self.data.year)

    def m(self):
        "Month; i.e. '01' to '12'"
@@ -188,7 +189,7 @@ class DateFormat(TimeFormat):

    def t(self):
        "Number of days in the given month; i.e. '28' to '31'"
        return u'%02d' % monthrange(self.data.year, self.data.month)[1]
        return u'%02d' % calendar.monthrange(self.data.year, self.data.month)[1]

    def T(self):
        "Time zone of this machine; e.g. 'EST' or 'MDT'"
@@ -199,8 +200,10 @@ class DateFormat(TimeFormat):

    def U(self):
        "Seconds since the Unix epoch (January 1 1970 00:00:00 GMT)"
        off = self.timezone and self.timezone.utcoffset(self.data) or 0
        return int(time.mktime(self.data.timetuple())) + off.seconds * 60
        if getattr(self.data, 'tzinfo', None):
            return int(calendar.timegm(self.data.utctimetuple()))
        else:
            return int(time.mktime(self.data.timetuple()))

    def w(self):
        "Day of the week, numeric, i.e. '0' (Sunday) to '6' (Saturday)"
@@ -214,12 +217,12 @@ class DateFormat(TimeFormat):
        weekday = self.data.weekday() + 1
        day_of_year = self.z()
        if day_of_year <= (8 - jan1_weekday) and jan1_weekday > 4:
            if jan1_weekday == 5 or (jan1_weekday == 6 and isleap(self.data.year-1)):
            if jan1_weekday == 5 or (jan1_weekday == 6 and calendar.isleap(self.data.year-1)):
                week_number = 53
            else:
                week_number = 52
        else:
            if isleap(self.data.year):
            if calendar.isleap(self.data.year):
                i = 366
            else:
                i = 365
+2 −1
Original line number Diff line number Diff line
@@ -506,7 +506,8 @@ Available format strings:
                      month, 2 characters.
    t                 Number of days in the given month.        ``28`` to ``31``
    T                 Time zone of this machine.                ``'EST'``, ``'MDT'``
    U                 Not implemented.
    U                 Seconds since the Unix Epoch
                      (January 1 1970 00:00:00 UTC).
    w                 Day of the week, digits without           ``'0'`` (Sunday) to ``'6'`` (Saturday)
                      leading zeros.
    W                 ISO-8601 week number of year, with        ``1``, ``53``
+1 −1
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ u'th'
u'31'
>>> no_tz or format(my_birthday, 'T') == 'CET'
True
>>> no_tz or format(my_birthday, 'U') == '300531600'
>>> no_tz or format(my_birthday, 'U') == '300315600'
True
>>> format(my_birthday, 'w')
u'0'
+48 −0
Original line number Diff line number Diff line
"""
>>> from datetime import datetime, date
>>> from django.utils.dateformat import format
>>> from django.utils.tzinfo import FixedOffset, LocalTimezone

# date
>>> d = date(2009, 5, 16)
>>> date.fromtimestamp(int(format(d, 'U'))) == d
True

# Naive datetime
>>> dt = datetime(2009, 5, 16, 5, 30, 30)
>>> datetime.fromtimestamp(int(format(dt, 'U'))) == dt
True

# datetime with local tzinfo
>>> ltz = LocalTimezone(datetime.now())
>>> dt = datetime(2009, 5, 16, 5, 30, 30, tzinfo=ltz)
>>> datetime.fromtimestamp(int(format(dt, 'U')), ltz) == dt
True
>>> datetime.fromtimestamp(int(format(dt, 'U'))) == dt.replace(tzinfo=None)
True

# datetime with arbitrary tzinfo
>>> tz = FixedOffset(-510)
>>> ltz = LocalTimezone(datetime.now())
>>> dt = datetime(2009, 5, 16, 5, 30, 30, tzinfo=tz)
>>> datetime.fromtimestamp(int(format(dt, 'U')), tz) == dt
True
>>> datetime.fromtimestamp(int(format(dt, 'U')), ltz) == dt
True
>>> datetime.fromtimestamp(int(format(dt, 'U'))) == dt.astimezone(ltz).replace(tzinfo=None)
True
>>> datetime.fromtimestamp(int(format(dt, 'U')), tz).utctimetuple() == dt.utctimetuple()
True
>>> datetime.fromtimestamp(int(format(dt, 'U')), ltz).utctimetuple() == dt.utctimetuple()
True

# Epoch
>>> utc = FixedOffset(0)
>>> udt = datetime(1970, 1, 1, tzinfo=utc)
>>> format(udt, 'U')
u'0'
"""

if __name__ == "__main__":
    import doctest
    doctest.testmod()
+2 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ from django.utils import html, checksums

import timesince
import datastructures
import dateformat
import itercompat
from decorators import DecoratorFromMiddlewareTests

@@ -22,6 +23,7 @@ except NameError:
__test__ = {
    'timesince': timesince,
    'datastructures': datastructures,
    'dateformat': dateformat,
    'itercompat': itercompat,
}