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
This commit is contained in:
parent
f7d01c49e9
commit
2af75b485d
|
@ -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.dates import MONTHS, MONTHS_3, MONTHS_AP, WEEKDAYS, WEEKDAYS_ABBR
|
||||||
from django.utils.tzinfo import LocalTimezone
|
from django.utils.tzinfo import LocalTimezone
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.utils.encoding import force_unicode
|
from django.utils.encoding import force_unicode
|
||||||
from calendar import isleap, monthrange
|
|
||||||
import re, time
|
|
||||||
|
|
||||||
re_formatchars = re.compile(r'(?<!\\)([aAbBdDfFgGhHiIjlLmMnNOPrsStTUwWyYzZ])')
|
re_formatchars = re.compile(r'(?<!\\)([aAbBdDfFgGhHiIjlLmMnNOPrsStTUwWyYzZ])')
|
||||||
re_escaped = re.compile(r'\\(.)')
|
re_escaped = re.compile(r'\\(.)')
|
||||||
|
@ -146,7 +147,7 @@ class DateFormat(TimeFormat):
|
||||||
|
|
||||||
def L(self):
|
def L(self):
|
||||||
"Boolean for whether it is a leap year; i.e. True or False"
|
"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):
|
def m(self):
|
||||||
"Month; i.e. '01' to '12'"
|
"Month; i.e. '01' to '12'"
|
||||||
|
@ -188,7 +189,7 @@ class DateFormat(TimeFormat):
|
||||||
|
|
||||||
def t(self):
|
def t(self):
|
||||||
"Number of days in the given month; i.e. '28' to '31'"
|
"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):
|
def T(self):
|
||||||
"Time zone of this machine; e.g. 'EST' or 'MDT'"
|
"Time zone of this machine; e.g. 'EST' or 'MDT'"
|
||||||
|
@ -199,8 +200,10 @@ class DateFormat(TimeFormat):
|
||||||
|
|
||||||
def U(self):
|
def U(self):
|
||||||
"Seconds since the Unix epoch (January 1 1970 00:00:00 GMT)"
|
"Seconds since the Unix epoch (January 1 1970 00:00:00 GMT)"
|
||||||
off = self.timezone and self.timezone.utcoffset(self.data) or 0
|
if getattr(self.data, 'tzinfo', None):
|
||||||
return int(time.mktime(self.data.timetuple())) + off.seconds * 60
|
return int(calendar.timegm(self.data.utctimetuple()))
|
||||||
|
else:
|
||||||
|
return int(time.mktime(self.data.timetuple()))
|
||||||
|
|
||||||
def w(self):
|
def w(self):
|
||||||
"Day of the week, numeric, i.e. '0' (Sunday) to '6' (Saturday)"
|
"Day of the week, numeric, i.e. '0' (Sunday) to '6' (Saturday)"
|
||||||
|
@ -214,12 +217,12 @@ class DateFormat(TimeFormat):
|
||||||
weekday = self.data.weekday() + 1
|
weekday = self.data.weekday() + 1
|
||||||
day_of_year = self.z()
|
day_of_year = self.z()
|
||||||
if day_of_year <= (8 - jan1_weekday) and jan1_weekday > 4:
|
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
|
week_number = 53
|
||||||
else:
|
else:
|
||||||
week_number = 52
|
week_number = 52
|
||||||
else:
|
else:
|
||||||
if isleap(self.data.year):
|
if calendar.isleap(self.data.year):
|
||||||
i = 366
|
i = 366
|
||||||
else:
|
else:
|
||||||
i = 365
|
i = 365
|
||||||
|
|
|
@ -506,7 +506,8 @@ Available format strings:
|
||||||
month, 2 characters.
|
month, 2 characters.
|
||||||
t Number of days in the given month. ``28`` to ``31``
|
t Number of days in the given month. ``28`` to ``31``
|
||||||
T Time zone of this machine. ``'EST'``, ``'MDT'``
|
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)
|
w Day of the week, digits without ``'0'`` (Sunday) to ``'6'`` (Saturday)
|
||||||
leading zeros.
|
leading zeros.
|
||||||
W ISO-8601 week number of year, with ``1``, ``53``
|
W ISO-8601 week number of year, with ``1``, ``53``
|
||||||
|
|
|
@ -37,7 +37,7 @@ u'th'
|
||||||
u'31'
|
u'31'
|
||||||
>>> no_tz or format(my_birthday, 'T') == 'CET'
|
>>> no_tz or format(my_birthday, 'T') == 'CET'
|
||||||
True
|
True
|
||||||
>>> no_tz or format(my_birthday, 'U') == '300531600'
|
>>> no_tz or format(my_birthday, 'U') == '300315600'
|
||||||
True
|
True
|
||||||
>>> format(my_birthday, 'w')
|
>>> format(my_birthday, 'w')
|
||||||
u'0'
|
u'0'
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
"""
|
||||||
|
>>> 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()
|
|
@ -8,6 +8,7 @@ from django.utils import html, checksums
|
||||||
|
|
||||||
import timesince
|
import timesince
|
||||||
import datastructures
|
import datastructures
|
||||||
|
import dateformat
|
||||||
import itercompat
|
import itercompat
|
||||||
from decorators import DecoratorFromMiddlewareTests
|
from decorators import DecoratorFromMiddlewareTests
|
||||||
|
|
||||||
|
@ -22,6 +23,7 @@ except NameError:
|
||||||
__test__ = {
|
__test__ = {
|
||||||
'timesince': timesince,
|
'timesince': timesince,
|
||||||
'datastructures': datastructures,
|
'datastructures': datastructures,
|
||||||
|
'dateformat': dateformat,
|
||||||
'itercompat': itercompat,
|
'itercompat': itercompat,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue