# -*- coding: utf-8 -*-
""" This module should contain all things associated with time or date that can be shared.
"""
import time
from datetime import datetime as _datetime
import tzlocal
local_tz = tzlocal.get_localzone()
[docs]class parsetime(_datetime): # NOQA
""" Modified class with loaders for our datetime formats.
"""
american_with_utc_format = "%m/%d/%y %H:%M:%S UTC"
iso_with_utc_format = "%Y-%m-%d %H:%M:%S UTC"
american_minutes = "%m/%d/%y %H:%M"
american_minutes_with_utc = "%m/%d/%y %H:%M UTC"
american_date_only_format = "%m/%d/%y"
iso_date_only_format = "%Y-%m-%d"
request_format = "%Y-%m-%d-%H-%M-%S"
long_date_format = "%B %d, %Y %H:%M"
saved_report_title_format = "%a, %d %b %Y %H:%M:%S +0000"
@classmethod
def _parse(cls, fmt, time_string):
return cls.fromtimestamp(
time.mktime(
time.strptime(
time_string,
fmt
)
)
)
[docs] @classmethod
def from_american_with_utc(cls, time_string):
""" Convert the string representation of the time into parsetime()
CFME's format here is 'mm/dd/yy hh:mm:ss UTC'
Args:
time_string: String with time to parse
Returns: :py:class`utils.timeutil.datetime()` object
"""
return cls._parse(cls.american_with_utc_format, time_string)
[docs] def to_american_with_utc(self):
""" Convert the this object to string representation in american with UTC.
CFME's format here is 'mm/dd/yy hh:mm:ss UTC'
Returns: :py:class`str` object
"""
return self.strftime(self.american_with_utc_format)
[docs] @classmethod
def from_iso_with_utc(cls, time_string):
""" Convert the string representation of the time into parsetime()
CFME's format here is 'mm-dd-yy hh:mm:ss UTC'
Args:
time_string: String with time to parse
Returns: :py:class`utils.timeutil.datetime()` object
"""
return cls._parse(cls.iso_with_utc_format, time_string)
[docs] def to_iso_with_utc(self):
""" Convert the this object to string representation in american with UTC.
CFME's format here is 'mm-dd-yy hh:mm:ss UTC'
Returns: :py:class`str` object
"""
return self.strftime(self.iso_with_utc_format)
[docs] @classmethod
def from_american_minutes(cls, time_string):
""" Convert the string representation of the time into parsetime()
CFME's format here is 'mm/dd/yy hh:mm'
Args:
time_string: String with time to parse
Returns: :py:class`utils.timeutil.datetime()` object
"""
return cls._parse(cls.american_minutes, time_string)
[docs] def to_american_minutes(self):
""" Convert the this object to string representation in american with just minutes.
CFME's format here is 'mm/dd/yy hh:mm'
Returns: :py:class`str` object
"""
return self.strftime(self.american_minutes)
[docs] @classmethod
def from_american_minutes_with_utc(cls, time_string):
""" Convert the string representation of the time into parsetime()
CFME's format here is 'mm/dd/yy hh:mm UTC'
Args:
time_string: String with time to parse
Returns: :py:class`utils.timeutil.datetime()` object
"""
return cls._parse(cls.american_minutes_with_utc, time_string)
[docs] def to_american_minutes_with_utc(self):
""" Convert the this object to string representation in american with just minutes.
CFME's format here is 'mm/dd/yy hh:mm'
Returns: :py:class`str` object
"""
return self.strftime(self.american_minutes_with_utc)
[docs] @classmethod
def from_american_date_only(cls, time_string):
""" Convert the string representation of the time into parsetime()
CFME's format here is 'mm/dd/yy'
Args:
time_string: String with time to parse
Returns: :py:class`utils.timeutil.datetime()` object
"""
return cls._parse(cls.american_date_only_format, time_string)
[docs] def to_american_date_only(self):
""" Convert the this object to string representation in american date only format.
CFME's format here is 'mm/dd/yy'
Returns: :py:class`str` object
"""
return self.strftime(self.american_date_only_format)
[docs] @classmethod
def from_iso_date(cls, time_string):
""" Convert the string representation of the time into parsetime()
Format here is 'YYYY-MM-DD'
Args:
time_string: String with time to parse
Returns: :py:class`utils.timeutil.datetime()` object
"""
return cls._parse(cls.iso_date_only_format, time_string)
[docs] def to_iso_date(self):
""" Convert the this object to string representation in ISO format.
Format here is 'YYYY-MM-DD'
Returns: :py:class`str` object
"""
return self.strftime(self.iso_date_only_format)
[docs]def nice_seconds(t_s):
"""Return nicer representation of seconds"""
if t_s < 60.0:
return "{0:.2f}s".format(t_s)
minutes = 1
while t_s - (minutes * 60.0) >= 60.0:
minutes += 1
seconds = t_s - (minutes * 60)
if minutes < 60.0:
return "{0}m{1:.2f}s".format(minutes, seconds)
# Hours
hours = 1
while minutes - (hours * 60.0) >= 60.0:
hours += 1
minutes = minutes - (hours * 60)
if hours < 24.0:
return "{0}h{1}m{2:.2f}s".format(hours, minutes, seconds)
# Days
days = 1
while hours - (days * 24.0) >= 24.0:
days += 1
hours = hours - (days * 24)
if days < 7.0:
return "{0}d{1}h{2}m{3:.2f}s".format(days, hours, minutes, seconds)
# Weeks
weeks = 1
while days - (weeks * 7.0) >= 7.0:
weeks += 1
days = days - (weeks * 7)
return "{0}w{1}d{2}h{3}m{4:.2f}s".format(weeks, days, hours, minutes, seconds)