Fixed #16924 -- Corrected `date` template filter handling of negative (West of UTC) timezone offsets.
The 'O' format specifier output was incorrect. Thanks mrgriscom and Aymeric Augustin. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16903 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
482388cd61
commit
3ef1762cb9
|
@ -182,9 +182,11 @@ class DateFormat(TimeFormat):
|
||||||
return MONTHS_AP[self.data.month]
|
return MONTHS_AP[self.data.month]
|
||||||
|
|
||||||
def O(self):
|
def O(self):
|
||||||
"Difference to Greenwich time in hours; e.g. '+0200'"
|
"Difference to Greenwich time in hours; e.g. '+0200', '-0430'"
|
||||||
seconds = self.Z()
|
seconds = self.Z()
|
||||||
return u"%+03d%02d" % (seconds // 3600, (seconds // 60) % 60)
|
sign = '-' if seconds < 0 else '+'
|
||||||
|
seconds = abs(seconds)
|
||||||
|
return u"%s%02d%02d" % (sign, seconds // 3600, (seconds // 60) % 60)
|
||||||
|
|
||||||
def r(self):
|
def r(self):
|
||||||
"RFC 2822 formatted date; e.g. 'Thu, 21 Dec 2000 16:01:07 +0200'"
|
"RFC 2822 formatted date; e.g. 'Thu, 21 Dec 2000 16:01:07 +0200'"
|
||||||
|
@ -275,8 +277,10 @@ class DateFormat(TimeFormat):
|
||||||
if not self.timezone:
|
if not self.timezone:
|
||||||
return 0
|
return 0
|
||||||
offset = self.timezone.utcoffset(self.data)
|
offset = self.timezone.utcoffset(self.data)
|
||||||
# Only days can be negative, so negative offsets have days=-1 and
|
# `offset` is a datetime.timedelta. For negative values (to the west of
|
||||||
# seconds positive. Positive offsets have days=0
|
# UTC) only days can be negative (days=-1) and seconds are always
|
||||||
|
# positive. e.g. UTC-1 -> timedelta(days=-1, seconds=82800, microseconds=0)
|
||||||
|
# Positive offsets have days=0
|
||||||
return offset.days * 86400 + offset.seconds
|
return offset.days * 86400 + offset.seconds
|
||||||
|
|
||||||
def format(value, format_string):
|
def format(value, format_string):
|
||||||
|
|
|
@ -13,7 +13,7 @@ class FixedOffset(tzinfo):
|
||||||
else:
|
else:
|
||||||
self.__offset = timedelta(minutes=offset)
|
self.__offset = timedelta(minutes=offset)
|
||||||
|
|
||||||
sign = offset < 0 and '-' or '+'
|
sign = '-' if offset < 0 else '+'
|
||||||
self.__name = u"%s%02d%02d" % (sign, abs(offset) / 60., abs(offset) % 60)
|
self.__name = u"%s%02d%02d" % (sign, abs(offset) / 60., abs(offset) % 60)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
|
|
@ -127,3 +127,9 @@ class DateFormatTests(unittest.TestCase):
|
||||||
self.assertEqual(dateformat.format(summertime, 'O'), u'+0200')
|
self.assertEqual(dateformat.format(summertime, 'O'), u'+0200')
|
||||||
self.assertEqual(dateformat.format(wintertime, 'I'), u'0')
|
self.assertEqual(dateformat.format(wintertime, 'I'), u'0')
|
||||||
self.assertEqual(dateformat.format(wintertime, 'O'), u'+0100')
|
self.assertEqual(dateformat.format(wintertime, 'O'), u'+0100')
|
||||||
|
|
||||||
|
# Ticket #16924 -- We don't need timezone support to test this
|
||||||
|
# 3h30m to the west of UTC
|
||||||
|
tz = FixedOffset(-3*60 - 30)
|
||||||
|
dt = datetime(2009, 5, 16, 5, 30, 30, tzinfo=tz)
|
||||||
|
self.assertEqual(dateformat.format(dt, 'O'), u'-0330')
|
||||||
|
|
Loading…
Reference in New Issue