mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Added support for timezone in date field. getdate_tz() and
parsedate_tz() return a 10-tuple, the last field is the tz offset in seconds (e.g. -18000 or -5 hours for EST).
This commit is contained in:
parent
3c8484e866
commit
27cb8a4884
1 changed files with 57 additions and 6 deletions
|
@ -253,6 +253,18 @@ class Message:
|
|||
return None
|
||||
return parsedate(data)
|
||||
|
||||
# Retrieve a date field from a header as a 10-tuple.
|
||||
# The first 9 elements make up a tuple compatible
|
||||
# with time.mktime(), and the 10th is the offset
|
||||
# of the poster's time zone from GMT/UTC.
|
||||
|
||||
def getdate_tz(self, name):
|
||||
try:
|
||||
data = self[name]
|
||||
except KeyError:
|
||||
return None
|
||||
return parsedate_tz(data)
|
||||
|
||||
|
||||
# Access as a dictionary (only finds *last* header of each type):
|
||||
|
||||
|
@ -386,8 +398,21 @@ def parseaddr(address):
|
|||
_monthnames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',
|
||||
'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
||||
|
||||
def parsedate(data):
|
||||
# XXX This still mostly ignores timezone matters at the moment...
|
||||
# The timezone table does not include the military time zones defined
|
||||
# in RFC822, other than Z. According to RFC1123, the description in
|
||||
# RFC822 gets the signs wrong, so we can't rely on any such time
|
||||
# zones. RFC1123 recommends that numeric timezone indicators be used
|
||||
# instead of timezone names.
|
||||
|
||||
_timezones = {'UT':0, 'UTC':0, 'GMT':0, 'Z':0,
|
||||
'AST': -400, 'ADT': -300, # Atlantic standard
|
||||
'EST': -500, 'EDT': -400, # Eastern
|
||||
'CST': -600, 'CDT':-500, # Centreal
|
||||
'MST':-700, 'MDT':-600, # Mountain
|
||||
'PST':-800, 'PDT':-700 # Pacific
|
||||
}
|
||||
|
||||
def parsedate_tz(data):
|
||||
data = string.split(data)
|
||||
if data[0][-1] == ',':
|
||||
# There's a dayname here. Skip it
|
||||
|
@ -420,9 +445,29 @@ def parsedate(data):
|
|||
tss = string.atoi(tss)
|
||||
except string.atoi_error:
|
||||
return None
|
||||
tuple = (yy, mm, dd, thh, tmm, tss, 0, 0, 0)
|
||||
tzoffset=0
|
||||
tz=string.upper(tz)
|
||||
if _timezones.has_key(tz):
|
||||
tzoffset=_timezones[tz]
|
||||
else:
|
||||
try:
|
||||
tzoffset=string.atoi(tz)
|
||||
except string.atoi_error:
|
||||
pass
|
||||
# Convert a timezone offset into seconds ; -0500 -> -18000
|
||||
if tzoffset<0: tzsign=-1
|
||||
else: tzsign=1
|
||||
tzoffset=tzoffset*tzsign
|
||||
tzoffset = tzsign * ( (tzoffset/100)*3600 + (tzoffset % 100)*60)
|
||||
tuple = (yy, mm, dd, thh, tmm, tss, 0, 0, 0, tzoffset)
|
||||
return tuple
|
||||
|
||||
def parsedate(data):
|
||||
t=parsedate_tz(data)
|
||||
if type(t)==type( () ):
|
||||
return t[:9]
|
||||
else: return t
|
||||
|
||||
|
||||
# When used as script, run a small test program.
|
||||
# The first command line argument must be a filename containing one
|
||||
|
@ -430,7 +475,7 @@ def parsedate(data):
|
|||
|
||||
if __name__ == '__main__':
|
||||
import sys, os
|
||||
file = os.path.join(os.environ['HOME'], 'Mail/drafts/,1')
|
||||
file = os.path.join(os.environ['HOME'], 'Mail/inbox/1')
|
||||
if sys.argv[1:]: file = sys.argv[1]
|
||||
f = open(file, 'r')
|
||||
m = Message(f)
|
||||
|
@ -438,9 +483,15 @@ if __name__ == '__main__':
|
|||
print 'To:', m.getaddrlist('to')
|
||||
print 'Subject:', m.getheader('subject')
|
||||
print 'Date:', m.getheader('date')
|
||||
date = m.getdate('date')
|
||||
date = m.getdate_tz('date')
|
||||
if date:
|
||||
print 'ParsedDate:', time.asctime(date)
|
||||
print 'ParsedDate:', time.asctime(date[:-1]),
|
||||
hhmmss = date[-1]
|
||||
hhmm, ss = divmod(hhmmss, 60)
|
||||
hh, mm = divmod(hhmm, 60)
|
||||
print "%+03d%02d" % (hh, mm),
|
||||
if ss: print ".%02d" % ss,
|
||||
print
|
||||
else:
|
||||
print 'ParsedDate:', None
|
||||
m.rewindbody()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue