| | 343 | def eachweekday(startDate, weekday, timeofday=None, endDate=None): |
|---|
| | 344 | """Yield the same time-of-day each week for the given day. The time-of-day |
|---|
| | 345 | defaults to midnight. |
|---|
| | 346 | |
|---|
| | 347 | Yielded values are datetime.datetime objects. |
|---|
| | 348 | For example: |
|---|
| | 349 | eachweekday(datetime.date(2006, 8, 10), 3, datetime.time(14, 3, 0)) |
|---|
| | 350 | yields the sequence: 2006-08-11 14:03:00, 2006-08-18 14:03:00, |
|---|
| | 351 | 2006-08-25 14:03:00, ... |
|---|
| | 352 | |
|---|
| | 353 | timeofday may be a datetime.time, as in the above example, or it |
|---|
| | 354 | may be a string, of the form "hour:min:sec". Seconds and minutes |
|---|
| | 355 | may be omitted if their colon ":" separator is also omitted. So |
|---|
| | 356 | the example above could be rewritten: |
|---|
| | 357 | eachday(datetime.date(2004, 5, 4), "14:03") |
|---|
| | 358 | """ |
|---|
| | 359 | if timeofday is None: |
|---|
| | 360 | timeofday = datetime.time(0) |
|---|
| | 361 | elif isinstance(timeofday, (str, unicode)): |
|---|
| | 362 | timeofday = time_from_str(timeofday) |
|---|
| | 363 | |
|---|
| | 364 | # get the given start time or datetime.time(0,0) |
|---|
| | 365 | startTime = getattr(startDate, 'time', datetime.time)() |
|---|
| | 366 | |
|---|
| | 367 | if startDate.weekday() > weekday or startTime > timeofday: |
|---|
| | 368 | offset = (7 + weekday) - startDate.weekday() |
|---|
| | 369 | while offset > 6: |
|---|
| | 370 | offset -= 7 |
|---|
| | 371 | while offset <= 0: |
|---|
| | 372 | offset += 7 |
|---|
| | 373 | startDate += datetime.timedelta(offset) |
|---|
| | 374 | |
|---|
| | 375 | startDate = datetime.datetime.combine(startDate, timeofday) |
|---|
| | 376 | |
|---|
| | 377 | # Now that we've coerced our startDate to a datetime, we need to |
|---|
| | 378 | # do the same thing to endDate so we can compare them. |
|---|
| | 379 | if endDate and not hasattr(endDate, "time"): |
|---|
| | 380 | endDate = datetime.datetime.combine(endDate, timeofday) |
|---|
| | 381 | |
|---|
| | 382 | end = getattr(endDate, 'date', lambda: None)() |
|---|
| | 383 | day_iter = eachweek(startDate.date(), weekday, end) |
|---|
| | 384 | startDate = datetime.datetime.combine(day_iter.next(), timeofday) |
|---|
| | 385 | |
|---|
| | 386 | while (endDate is None) or (startDate <= endDate): |
|---|
| | 387 | yield startDate |
|---|
| | 388 | startDate = datetime.datetime.combine(day_iter.next(), timeofday) |
|---|
| | 389 | |
|---|
| 586 | | eachweek: [r"mon(?:days?)?", r"tues?(?:days?)?", |
|---|
| 587 | | r"wed(?:nesdays?)?", r"thurs?(?:days?)?", |
|---|
| | 633 | # $ in first regex below so as not to match "month" |
|---|
| | 634 | eachweekday: [r"([\S]+) (?:every|each) mon(?:day)?$", |
|---|
| | 635 | r"([\S]+) (?:every|each) tue(?:s?)?(?:day$)?$", |
|---|
| | 636 | r"([\S]+) (?:every|each) wed(?:nesday)?", |
|---|
| | 637 | r"([\S]+) (?:every|each) thu(?:rs?)?(?:day)?$", |
|---|
| | 638 | r"([\S]+) (?:every|each) fri(?:day)?", |
|---|
| | 639 | r"([\S]+) (?:every|each) sat(?:urday)?", |
|---|
| | 640 | r"([\S]+) (?:every|each) sun(?:day)?", |
|---|
| | 641 | ], |
|---|
| | 642 | eachweek: [r"mon(?:days?)?", r"tue(?:s?)s?(?:days)?$", |
|---|
| | 643 | r"wed(?:nesdays?)?", r"thu(?:rs?)?(?:days)?$", |
|---|