From 816cf9d1b44da4cc973b8fc8dbfdaf220507d0fc Mon Sep 17 00:00:00 2001 From: Jack Jansen Date: Thu, 12 Oct 2000 21:20:41 +0000 Subject: [PATCH] Python implementation of strptime(). --- Mac/Contrib/strptime/strptime.py | 250 +++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 Mac/Contrib/strptime/strptime.py diff --git a/Mac/Contrib/strptime/strptime.py b/Mac/Contrib/strptime/strptime.py new file mode 100644 index 00000000000..12b79aa8eee --- /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() + +