22
22
"""this module contains some helper functions converting strings or list of
23
23
strings to date(time) or event objects"""
24
24
25
+ from calendar import isleap
25
26
from datetime import date , datetime , timedelta , time
26
27
import random
27
28
import string
29
+ from time import strptime
28
30
29
31
import icalendar
30
32
import pytz
@@ -145,14 +147,18 @@ def datetimefstr_weekday(dtime_list, timeformat):
145
147
return dtime
146
148
147
149
148
- def guessdatetimefstr (dtime_list , locale , default_day = datetime . today () ):
150
+ def guessdatetimefstr (dtime_list , locale , default_day = None ):
149
151
"""
150
152
:type dtime_list: list
151
153
:type locale: dict
152
154
:type default_day: datetime.datetime
153
155
:rtype: datetime.datetime
154
156
"""
157
+ # if now() is called as default param, mocking with freezegun won't work
158
+ if default_day is None :
159
+ default_day = datetime .now ().date ()
155
160
# TODO rename in guessdatetimefstrLIST or something saner altogether
161
+
156
162
def timefstr_day (dtime_list , timeformat ):
157
163
if locale ['timeformat' ] == '%H:%M' and dtime_list [0 ] == '24:00' :
158
164
a_date = datetime .combine (default_day , time (0 ))
@@ -163,8 +169,26 @@ def timefstr_day(dtime_list, timeformat):
163
169
return a_date
164
170
165
171
def datefstr_year (dtime_list , dateformat ):
166
- a_date = datetimefstr (dtime_list , dateformat )
167
- a_date = datetime (* (default_day .timetuple ()[:1 ] + a_date .timetuple ()[1 :5 ]))
172
+ """should be used if a date(time) without year is given
173
+
174
+ we cannot use datetimefstr() here, because only time.strptime can
175
+ parse the 29th of Feb. if no year is given
176
+
177
+ example: dtime_list = ['17.03.', 'description']
178
+ dateformat = '%d.%m.'
179
+ or : dtime_list = ['17.03.', '16:00', 'description']
180
+ dateformat = '%d.%m. %H:%M'
181
+ """
182
+ parts = dtformat .count (' ' ) + 1
183
+ dtstring = ' ' .join (dtime_list [0 :parts ])
184
+ dtstart = strptime (dtstring , dtformat )
185
+ if dtstart .tm_mon == 2 and dtstart .tm_mday == 29 and not isleap (default_day .year ):
186
+ raise ValueError
187
+
188
+ for _ in range (parts ):
189
+ dtime_list .pop (0 )
190
+
191
+ a_date = datetime (* (default_day .timetuple ()[:1 ] + dtstart [1 :5 ]))
168
192
return a_date
169
193
170
194
dtstart = None
0 commit comments