Commit 3197d275 authored by Lennart Regebro's avatar Lennart Regebro

Fix for collector issue #411. DateTime.rfc822() is not rfc2822 compliant.

parent 42ea9a15
...@@ -12,13 +12,12 @@ ...@@ -12,13 +12,12 @@
############################################################################## ##############################################################################
"""Encapsulation of date/time values""" """Encapsulation of date/time values"""
__version__='$Revision: 1.79 $'[11:-2] __version__='$Revision: 1.80 $'[11:-2]
import re,sys, os, math, DateTimeZone import re,sys, os, math, DateTimeZone
from time import time, gmtime, localtime, asctime from time import time, gmtime, localtime, asctime
from time import timezone, strftime from time import daylight, timezone, altzone, strftime
from time import daylight, timezone, altzone
from types import InstanceType,IntType,FloatType,StringType,UnicodeType from types import InstanceType,IntType,FloatType,StringType,UnicodeType
try: from time import tzname try: from time import tzname
except: tzname=('UNKNOWN','UNKNOWN') except: tzname=('UNKNOWN','UNKNOWN')
...@@ -400,6 +399,9 @@ def safelocaltime(t): ...@@ -400,6 +399,9 @@ def safelocaltime(t):
rval = localtime(t_int) rval = localtime(t_int)
return rval return rval
def _tzoffset2rfc822zone(seconds):
return "%+03d%02d" % divmod( (-seconds/60), 60)
class DateTime: class DateTime:
"""DateTime objects represent instants in time and provide """DateTime objects represent instants in time and provide
...@@ -1435,9 +1437,16 @@ class DateTime: ...@@ -1435,9 +1437,16 @@ class DateTime:
def rfc822(self): def rfc822(self):
"""Return the date in RFC 822 format""" """Return the date in RFC 822 format"""
if self._tz == self._localzone0: #Use local standard time
tzoffset = _tzoffset2rfc822zone(localzone)
elif self._tz == self._localzone1: # Use local daylight saving time
tzoffset = _tzoffset2rfc822zone(altzone)
else:
tzoffset = '-0000' # unknown time zone offset
return '%s, %2.2d %s %d %2.2d:%2.2d:%2.2d %s' % ( return '%s, %2.2d %s %d %2.2d:%2.2d:%2.2d %s' % (
self._aday,self._day,self._amon,self._year, self._aday,self._day,self._amon,self._year,
self._hour,self._minute,self._nearsec,self._tz) self._hour,self._minute,self._nearsec,tzoffset)
# New formats # New formats
......
# To run these tests, use: # To run these tests, use:
# python unittest.py DateTime.tests.suite # python unittest.py DateTime.tests.suite
...@@ -5,9 +6,7 @@ import unittest ...@@ -5,9 +6,7 @@ import unittest
from DateTime import DateTime from DateTime import DateTime
import string import string
import math import math
import time
import os
__basedir__ = os.getcwd()
class DateTimeTests (unittest.TestCase): class DateTimeTests (unittest.TestCase):
...@@ -218,23 +217,28 @@ class DateTimeTests (unittest.TestCase): ...@@ -218,23 +217,28 @@ class DateTimeTests (unittest.TestCase):
isoDt = DateTime('2002-05-02T08:00:00Z-04:00') isoDt = DateTime('2002-05-02T08:00:00Z-04:00')
self.assertEqual( ref1, isoDt) self.assertEqual( ref1, isoDt)
def testRFC822(self):
'''rfc822 conversion'''
isDST = time.localtime(time.time())[8]
if isDST:
offset = time.altzone
else:
offset = time.timezone
rfc822zone = "%+03d%02d" % divmod( (-offset/60), 60)
wrongzone = "%+03d:%02d" % divmod( (60-offset/60), 60) #one hour off, ISO format
# Create a local DateTime and test
dt = DateTime(2002, 5, 2, 8, 0, 0)
self.assertEqual(dt.rfc822(), 'Thu, 02 May 2002 08:00:00' + ' ' + rfc822zone)
def testJulianWeek(self): # Create a non-local date time and test
""" check JulianDayWeek function """ dt = DateTime('2002-05-02T08:00:00Z'+wrongzone)
self.assertEqual(dt.rfc822(), 'Thu, 02 May 2002 08:00:00 -0000')
try:
import gzip
except ImportError:
print "Warning: testJulianWeek disabled: module gzip not found"
return 0
lines = gzip.GzipFile(os.path.join(__basedir__,
'julian_testdata.txt.gz')).readlines()
for line in lines: #print dt.rfc822()
d = DateTime(line[:10])
result_from_mx=tuple(map(int, line[12:-2].split(',')))
self.assertEqual(result_from_mx[1], d.week())
def test_suite(): def test_suite():
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment