Skip to content

Instantly share code, notes, and snippets.

@lukassup
Created August 7, 2016 22:18
Show Gist options
  • Save lukassup/ca4b65fb536aba5ec6d4aac1b562f44d to your computer and use it in GitHub Desktop.
Save lukassup/ca4b65fb536aba5ec6d4aac1b562f44d to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""various date/time utilities
<datetime.datetime> parsing behavior
[year(-|/|.)month(-|/|.)day(_whitespace_)][[[hour]:minute]:second]
<datetime.timedelta> parsing behavior
[days(_whitespace_)][[[hours]:minutes]:seconds]
"""
import re
from collections import defaultdict
from datetime import datetime
from dateutil.relativedelta import relativedelta
RELATIVEDELTA_FMT = re.compile(
r"^((?P<days>[\-+]?\d+)d\s*)?"
"(((?P<hour>\d+)"
"(:(?P<minute>\d+))?)?"
"(:(?P<second>\d+))?)?$"
)
def _time_parser(timestamp, pattern):
"""Parses a string to date/time components with a regular expression"""
parts = pattern.match(timestamp)
if parts:
time_components = defaultdict(int)
for (name, value) in parts.groupdict().items():
if value:
time_components[name] = int(value)
return time_components
else:
raise NotImplementedError("A date of unknown format provided: "
"'{0}'".format(timestamp))
def parse_relativedelta(timestamp):
"""Parse relativedelta from string"""
return relativedelta(
microsecond=0,
**_time_parser(timestamp, RELATIVEDELTA_FMT)
)
if __name__ == "__main__":
from sys import argv, exit
try:
dt = parse_relativedelta(argv[1])
print(datetime.now() + dt)
except Exception as e:
raise e
exit(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment