summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2000-10-12 21:20:41 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2000-10-12 21:20:41 (GMT)
commit816cf9d1b44da4cc973b8fc8dbfdaf220507d0fc (patch)
tree5f46a195c76c46d646109f7639f1ae6f35e4426c
parent14126df562affe474a6a9d065cb37a603908faf6 (diff)
downloadcpython-816cf9d1b44da4cc973b8fc8dbfdaf220507d0fc.zip
cpython-816cf9d1b44da4cc973b8fc8dbfdaf220507d0fc.tar.gz
cpython-816cf9d1b44da4cc973b8fc8dbfdaf220507d0fc.tar.bz2
Python implementation of strptime().
-rw-r--r--Mac/Contrib/strptime/strptime.py250
1 files changed, 250 insertions, 0 deletions
diff --git a/Mac/Contrib/strptime/strptime.py b/Mac/Contrib/strptime/strptime.py
new file mode 100644
index 0000000..12b79aa
--- /dev/null
+++ b/Mac/Contrib/strptime/strptime.py
@@ -0,0 +1,250 @@
+""" strptime version 1.3, Time-stamp: <96/09/23 21:22:24 flognat>
+ The reverse of strftime.
+
+ Copyright (C) 1996 Andy Eskilsson, flognat@fukt.hk-r.se
+
+ This is free software; unrestricted redistribution is allowed under the
+ terms of the GPL. For full details of the license conditions of this
+ software, see the GNU General Public License.
+
+ And here comes the documentation:
+
+ Throw a string and a format specification at strptime and if everything
+ is ok you will get a tuple containing 9 items that are compatible with
+ pythons time-module.
+
+ interface:
+ strptime(inputstring, formatstring)
+
+ Little errorchecking... so you'd better know what you are doing.
+
+ example:
+ from strptime import *
+ mktime(strptime("26/6 1973", "%d/%m %Y"))
+
+ And voila you have the second when the author of this function was born.
+
+ The supported format identifiers are:
+ %a weekday in short text-form, e.g. Mon
+ %A weekday in long text-form, e.g. Monday
+ %b month in short text-form, e.g. Jul
+ %B month in long text-form e.g. July
+ %c the format specified by DateAndTimeRepresentation
+ %d the day in month in numeric form, e.g. 24
+ %H hour in 24 hour form
+ %j julian day (day of year)
+ %m month in numeric format
+ %M minute
+ %S second
+ %T Time in '%H:%M:%S'-format
+ %w weekday, 0=monday
+ %x date in format represented by DateRepresentation
+ %X time in format represented by TimeRepresentation
+ %y year in short form
+ %Y year in long form
+ %% %-sign
+
+ I have done some thinking here (*REALLY*) and it is possible to configure
+ this module so it uses other languages by adding their names to the
+ dictionaries first in the file, and setting the variable LANGUAGE.
+
+ For your exercise I have inserted the swedish names ;-)
+
+ The lfind, name, complex, numbers and parse functions are for internal
+ use, called by strptime.
+
+ Uh.. oh yeah.. if you want to get in touch with me.. I am reachable
+ at flognat@fukt.hk-r.se, the newest version of this file can probably
+ be found somewhere close to http://www.fukt.hk-r.se/~flognat
+
+ If you like it, send a postcard to Andy Eskilsson
+ Kämnärsv. 3b228
+ S-226 46 Lund
+ Sweden
+
+ Uhm be gentle with the bug-reports, its the first time for me ;-)
+
+ """
+
+import string
+
+LongDayNames={ 'English' : [ 'Monday', 'Tuesday', 'Wednesday',
+ 'Thursday', 'Friday', 'Saturday', 'Sunday'],
+ 'Swedish' : [ 'Måndag', 'Tisdag', 'Onsdag', 'Torsdag',
+ 'Fredag', 'Lördag', 'Söndag']}
+ShortDayNames={ 'English' : [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+ 'Swedish' : [ 'Mån', 'Tis', 'Ons', 'Tor', 'Fre', 'Lör', 'Sön']}
+
+LongMonthNames={ 'English' : ['none', 'January', 'February', 'March', 'April',
+ 'May', 'June', 'July', 'August', 'September',
+ 'October', 'November', 'December'],
+ 'Swedish' : ['none', 'Januari', 'Februari', 'Mars', 'April',
+ 'Maj', 'Juni', 'Juli', 'Augusti','September',
+ 'Oktober', 'November', 'December'] }
+ShortMonthNames={ 'English' : ['none', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ 'Swedish' : ['none', 'Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec']}
+DateAndTimeRepresentation={ 'English' : '%a %b %d %H:%m:%S %Y',
+ 'Swedish' : '%a %d %b %Y %H:%m:%S' }
+
+DateRepresentation = { 'English' : '%m/%d/%y',
+ 'Swedish' : '%d/%m/%y'}
+
+TimeRepresentation = { 'English' : '%H:%M:%S',
+ 'Swedish' : '%H:%M:%S'}
+
+LANGUAGE='English'
+
+BadFormatter='An illegal formatter was given'
+
+#Check if strinf begins with substr
+def lfind(str, substr):
+ return string.lower(str[:len(substr)])==string.lower(substr)
+
+#atoms consisting of other atoms
+def complex(str, format, base):
+ code=format[:1]
+ if code=='c':
+ string=DateAndTimeRepresentation[LANGUAGE]
+ elif code=='T':
+ string='%H:%M:%S'
+ elif code=='x':
+ string=DateRepresentation[LANGUAGE]
+ elif code=='X':
+ string=TimeRepresentation[LANGUAGE]
+
+ return parse(str, string, base)
+
+#string based names
+def names(str, format, base):
+ code=format[:1]
+ if code=='a':
+ selection=ShortDayNames[LANGUAGE]
+ result='weekd'
+ elif code=='A':
+ selection=LongDayNames[LANGUAGE]
+ result='weekd'
+ elif code=='b':
+ selection=ShortMonthNames[LANGUAGE]
+ result='month'
+ elif code=='B':
+ selection=LongMonthNames[LANGUAGE]
+ result='month'
+
+ match=None
+ for i in selection:
+ if lfind(str, i):
+ match=i
+ break
+
+ base[result]=selection.index(match)
+ return len(match)
+
+#numeric stuff
+def numeric(str, format, base):
+ code=format[:1]
+ if code=='d': result='day'
+ elif code=='H': result='hour'
+ elif code=='j': result='juliand'
+ elif code=='m': result='month'
+ elif code=='M': result='min'
+ elif code=='S': result='sec'
+ elif code=='w': result='weekd'
+ elif code=='y': result='shortYear'
+ elif code=='Y': result='year'
+
+ i=0
+ while str[i] in string.whitespace: i=i+1
+ j=i
+ if len(format)>1:
+ while not str[j] in string.whitespace and str[j]!=format[1]: j=j+1
+ else:
+ try:
+ while not str[j] in string.whitespace: j=j+1
+ except IndexError:
+ pass
+
+ # hmm could check exception here, but what could I add?
+ base[result]=string.atoi(str[i:j])
+
+ return j
+
+parseFuns={ 'a':names, 'A':names, 'b':names, 'B':names, 'c':complex, 'd':numeric,
+ 'H':numeric, 'j':numeric, 'm':numeric, 'M':numeric, 'S':numeric,
+ 'T':complex, 'w':numeric, 'x':complex, 'y':numeric, 'Y':numeric}
+
+# Well split up in atoms, reason to why this is separated from atrptime
+# is to be able to reparse complex atoms
+def parse(str, format, base):
+ atoms=string.split(format, '%')
+ charCounter=0
+ atomCounter=0
+
+ # Hey I am laazy and think that the format is exactly what the string is!
+ charCounter=charCounter+len(atoms[atomCounter])
+ atomCounter=atomCounter+1
+
+ while atomCounter < len(atoms) and charCounter < len(str):
+ atom=atoms[atomCounter]
+
+ if atom=='': # escaped
+ charCounter=charCounter+1
+ atomCounter=atomCounter+1
+ charCounter=charCounter+len(atoms[atomCounter])
+ else:
+ try:
+ parsefunction=parseFuns[atom[:1]]
+ except KeyError:
+ raise BadFormatter, atom[:1]
+ grabbed=apply(parsefunction, (str[charCounter:], atom, base))
+ charCounter=charCounter+grabbed+len(atom)-1
+
+ atomCounter=atomCounter+1
+
+ return charCounter
+
+# Ok here we go, tadaaa --> STRPTIME <-- at last..
+def strptime(str, format):
+ """Converts str specified by format to tuple useable by the time module"""
+ returnTime={}
+ returnTime['year']=0
+ returnTime['shortYear']=None
+ returnTime['month']=0
+ returnTime['day']=0
+ returnTime['hour']=0
+ returnTime['min']=0
+ returnTime['sec']=0
+ returnTime['weekd']=0
+ returnTime['juliand']=0
+ returnTime['dst']=0
+
+ parse(str, format, returnTime)
+
+ if returnTime['shortYear']!=None:
+ returnTime['year']=returnTime['shortYear']+1900
+
+ return (returnTime['year'], returnTime['month'], returnTime['day'],
+ returnTime['hour'], returnTime['min'], returnTime['sec'],
+ returnTime['weekd'], returnTime['juliand'], returnTime['dst'])
+
+# just for my convenience
+def strpdebug():
+ import pdb
+ pdb.run('strptime("% Tue 3 Feb", "%% %a %d %b")')
+
+def test():
+ from time import *
+ a=asctime(localtime(time()))
+ print a
+ b=strptime(a, '%a %b %d %H:%M:%S %Y')
+ print asctime(b)
+ print strptime("%% % Tue 3 Feb", "%%%% %% %a %d %b")
+ print strptime('Thu, 12 Sep 1996 19:42:06 GMT', '%a, %d %b %Y %T GMT')
+ print strptime('Thu, 12 Sep 1996 19:42:06 GMT', '%a, %d %b %Y %T')
+ print strptime('Thu, 12 Sep 1996 19:42:06', '%a, %d %b %Y %T')
+
+if __name__ == '__main__':
+ test()
+
+