diff options
Diffstat (limited to 'src/utils')
| -rw-r--r-- | src/utils/datetime/__init__.py | 2 | ||||
| -rw-r--r-- | src/utils/datetime/common.py | 42 | ||||
| -rw-r--r-- | src/utils/datetime/format.py (renamed from src/utils/datetime.py) | 68 | ||||
| -rw-r--r-- | src/utils/datetime/parse.py | 25 | ||||
| -rw-r--r-- | src/utils/parse/time.py | 2 |
5 files changed, 75 insertions, 64 deletions
diff --git a/src/utils/datetime/__init__.py b/src/utils/datetime/__init__.py new file mode 100644 index 00000000..dbe546db --- /dev/null +++ b/src/utils/datetime/__init__.py @@ -0,0 +1,2 @@ +from .common import * +from . import format, parse diff --git a/src/utils/datetime/common.py b/src/utils/datetime/common.py new file mode 100644 index 00000000..7235fbab --- /dev/null +++ b/src/utils/datetime/common.py @@ -0,0 +1,42 @@ +import datetime as _datetime +import enum + +ISO8601_FORMAT_DT = "%Y-%m-%dT%H:%M:%S" +ISO8601_FORMAT_TZ = "%z" + +TIME_HUMAN = "%H:%M:%S" +DATE_HUMAN = "%Y-%m-%d" + +class TimeSpec(enum.Enum): + NORMAL = 1 + MILLISECOND = 2 + +TIME_SECOND = 1 +TIME_MINUTE = TIME_SECOND*60 +TIME_HOUR = TIME_MINUTE*60 +TIME_DAY = TIME_HOUR*24 +TIME_WEEK = TIME_DAY*7 + +SECONDS_MINUTES = 60 +SECONDS_HOURS = SECONDS_MINUTES*60 +SECONDS_DAYS = SECONDS_HOURS*24 +SECONDS_WEEKS = SECONDS_DAYS*7 + +UNIT_MINIMUM = 6 +UNIT_SECOND = 5 +UNIT_MINUTE = 4 +UNIT_HOUR = 3 +UNIT_DAY = 2 +UNIT_WEEK = 1 +UNIT_MONTH = 1 +UNIT_YEAR = 1 + +def utcnow() -> _datetime.datetime: + return _datetime.datetime.utcnow().replace(tzinfo=_datetime.timezone.utc) + +def timestamp(seconds: float) -> _datetime.datetime: + return _datetime.datetime.fromtimestamp(seconds).replace( + tzinfo=_datetime.timezone.utc) + +def seconds_since(dt: _datetime.datetime) -> float: + return (utcnow()-dt).total_seconds() diff --git a/src/utils/datetime.py b/src/utils/datetime/format.py index 650893d1..feefde82 100644 --- a/src/utils/datetime.py +++ b/src/utils/datetime/format.py @@ -1,24 +1,9 @@ -import enum, re, typing +import typing import datetime as _datetime -import dateutil.parser, dateutil.relativedelta +import dateutil.relativedelta +from .common import * -ISO8601_FORMAT_DT = "%Y-%m-%dT%H:%M:%S" -ISO8601_FORMAT_TZ = "%z" - -TIME_HUMAN = "%H:%M:%S" -DATE_HUMAN = "%Y-%m-%d" - -class TimeSpec(enum.Enum): - NORMAL = 1 - MILLISECOND = 2 - -def utcnow() -> _datetime.datetime: - return _datetime.datetime.utcnow().replace(tzinfo=_datetime.timezone.utc) -def datetime_timestamp(seconds: float) -> _datetime.datetime: - return _datetime.datetime.fromtimestamp(seconds).replace( - tzinfo=_datetime.timezone.utc) - -def iso8601_format(dt: _datetime.datetime, timespec: TimeSpec=TimeSpec.NORMAL +def iso8601(dt: _datetime.datetime, timespec: TimeSpec=TimeSpec.NORMAL ) -> str: dt_format = dt.strftime(ISO8601_FORMAT_DT) tz_format = dt.strftime(ISO8601_FORMAT_TZ) @@ -29,10 +14,7 @@ def iso8601_format(dt: _datetime.datetime, timespec: TimeSpec=TimeSpec.NORMAL return "%s%s%s" % (dt_format, ms_format, tz_format) def iso8601_format_now(timespec: TimeSpec=TimeSpec.NORMAL) -> str: - return iso8601_format(utcnow(), timespec) - -def iso8601_parse(s: str) -> _datetime.datetime: - return dateutil.parser.parse(s) + return iso8601(utcnow(), timespec) def datetime_human(dt: _datetime.datetime, timespec: TimeSpec=TimeSpec.NORMAL): date = _datetime.datetime.strftime(dt, DATE_HUMAN) @@ -43,15 +25,6 @@ def datetime_human(dt: _datetime.datetime, timespec: TimeSpec=TimeSpec.NORMAL): def date_human(dt: _datetime.datetime, timespec: TimeSpec=TimeSpec.NORMAL): return _datetime.datetime.strftime(dt, DATE_HUMAN) -def seconds_since(dt: _datetime.datetime) -> float: - return (utcnow()-dt).total_seconds() - -TIME_SECOND = 1 -TIME_MINUTE = TIME_SECOND*60 -TIME_HOUR = TIME_MINUTE*60 -TIME_DAY = TIME_HOUR*24 -TIME_WEEK = TIME_DAY*7 - def time_unit(seconds: int) -> typing.Tuple[int, str]: since = None unit = None @@ -75,37 +48,6 @@ def time_unit(seconds: int) -> typing.Tuple[int, str]: unit = "%ss" % unit # pluralise the unit return (since, unit) -REGEX_PRETTYTIME = re.compile( - r"(?:(\d+)w)?(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?", re.I) - -SECONDS_MINUTES = 60 -SECONDS_HOURS = SECONDS_MINUTES*60 -SECONDS_DAYS = SECONDS_HOURS*24 -SECONDS_WEEKS = SECONDS_DAYS*7 - -def from_pretty_time(pretty_time: str) -> typing.Optional[int]: - seconds = 0 - - match = re.match(REGEX_PRETTYTIME, pretty_time) - if match: - seconds += int(match.group(1) or 0)*SECONDS_WEEKS - seconds += int(match.group(2) or 0)*SECONDS_DAYS - seconds += int(match.group(3) or 0)*SECONDS_HOURS - seconds += int(match.group(4) or 0)*SECONDS_MINUTES - seconds += int(match.group(5) or 0) - - if seconds > 0: - return seconds - return None - -UNIT_MINIMUM = 6 -UNIT_SECOND = 5 -UNIT_MINUTE = 4 -UNIT_HOUR = 3 -UNIT_DAY = 2 -UNIT_WEEK = 1 -UNIT_MONTH = 1 -UNIT_YEAR = 1 def to_pretty_time(total_seconds: int, minimum_unit: int=UNIT_SECOND, max_units: int=UNIT_MINIMUM) -> str: if total_seconds == 0: diff --git a/src/utils/datetime/parse.py b/src/utils/datetime/parse.py new file mode 100644 index 00000000..8e372f8c --- /dev/null +++ b/src/utils/datetime/parse.py @@ -0,0 +1,25 @@ +import re, typing +import datetime as _datetime +import dateutil.parser +from .common import * + +def iso8601(s: str) -> _datetime.datetime: + return dateutil.parser.parse(s) + +REGEX_PRETTYTIME = re.compile( + r"(?:(\d+)w)?(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?", re.I) + +def from_pretty_time(pretty_time: str) -> typing.Optional[int]: + seconds = 0 + + match = re.match(REGEX_PRETTYTIME, pretty_time) + if match: + seconds += int(match.group(1) or 0)*SECONDS_WEEKS + seconds += int(match.group(2) or 0)*SECONDS_DAYS + seconds += int(match.group(3) or 0)*SECONDS_HOURS + seconds += int(match.group(4) or 0)*SECONDS_MINUTES + seconds += int(match.group(5) or 0) + + if seconds > 0: + return seconds + return None diff --git a/src/utils/parse/time.py b/src/utils/parse/time.py index 51094c2d..217b920a 100644 --- a/src/utils/parse/time.py +++ b/src/utils/parse/time.py @@ -2,7 +2,7 @@ from src.utils import datetime def duration(s: str): if s[0] == "+": - duration = datetime.from_pretty_time(s[1:]) + duration = datetime.parse.from_pretty_time(s[1:]) if not duration == None: return duration return None |
