X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Futil%2Fsfatime.py;h=6793ad57e6c91b3af9b56d0a308fb0675dde60c3;hb=4a9e6751f9f396f463932133b9d62fc925a99ef6;hp=743566739aaf530dcad2f6c477a5d693e1574040;hpb=30d9951e075d93127c3909dcb41be09b420b3525;p=sfa.git diff --git a/sfa/util/sfatime.py b/sfa/util/sfatime.py index 74356673..6793ad57 100644 --- a/sfa/util/sfatime.py +++ b/sfa/util/sfatime.py @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE WORK OR THE USE OR OTHER DEALINGS # IN THE WORK. #---------------------------------------------------------------------- -from __future__ import print_function + import time import datetime @@ -33,6 +33,7 @@ from sfa.util.py23 import StringType SFATIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ" + def utcparse(input): """ Translate a string into a time using dateutil.parser.parse but make sure it's in UTC time and strip the timezone, so that it's compatible with normal datetime.datetime objects. @@ -40,18 +41,21 @@ the timezone, so that it's compatible with normal datetime.datetime objects. For safety this can also handle inputs that are either timestamps, or datetimes """ - def handle_shorthands (input): + def handle_shorthands(input): """recognize string like +5d or +3w or +2m as 2 days, 3 weeks or 2 months from now""" if input.startswith('+'): - match=re.match (r"([0-9]+)([dwm])",input[1:]) + match = re.match(r"([0-9]+)([dwm])", input[1:]) if match: - how_many=int(match.group(1)) - what=match.group(2) - if what == 'd': d=datetime.timedelta(days=how_many) - elif what == 'w': d=datetime.timedelta(weeks=how_many) - elif what == 'm': d=datetime.timedelta(weeks=4*how_many) - return datetime.datetime.utcnow()+d + how_many = int(match.group(1)) + what = match.group(2) + if what == 'd': + d = datetime.timedelta(days=how_many) + elif what == 'w': + d = datetime.timedelta(weeks=how_many) + elif what == 'm': + d = datetime.timedelta(weeks=4 * how_many) + return datetime.datetime.utcnow() + d # prepare the input for the checks below by # casting strings ('1327098335') to ints @@ -60,37 +64,43 @@ For safety this can also handle inputs that are either timestamps, or datetimes input = int(input) except ValueError: try: - new_input=handle_shorthands(input) - if new_input is not None: input=new_input + new_input = handle_shorthands(input) + if new_input is not None: + input = new_input except: import traceback traceback.print_exc() - #################### here we go - if isinstance (input, datetime.datetime): + # here we go + if isinstance(input, datetime.datetime): #logger.info ("argument to utcparse already a datetime - doing nothing") return input - elif isinstance (input, StringType): + elif isinstance(input, StringType): t = dateutil.parser.parse(input) if t.utcoffset() is not None: t = t.utcoffset() + t.replace(tzinfo=None) return t - elif isinstance (input, (int,float,long)): + elif isinstance(input, (int, float)): return datetime.datetime.fromtimestamp(input) else: - logger.error("Unexpected type in utcparse [%s]"%type(input)) + logger.error("Unexpected type in utcparse [%s]" % type(input)) + def datetime_to_string(dt): return datetime.datetime.strftime(dt, SFATIME_FORMAT) + def datetime_to_utc(dt): return time.gmtime(datetime_to_epoch(dt)) -# see https://docs.python.org/2/library/time.html +# see https://docs.python.org/2/library/time.html # all timestamps are in UTC so time.mktime() would be *wrong* + + def datetime_to_epoch(dt): return int(calendar.timegm(dt.timetuple())) + def add_datetime(input, days=0, hours=0, minutes=0, seconds=0): """ Adjust the input date by the specified delta (in seconds). @@ -100,9 +110,10 @@ def add_datetime(input, days=0, hours=0, minutes=0, seconds=0): if __name__ == '__main__': # checking consistency - print(20*'X') - print(("Should be close to zero: %s"%(datetime_to_epoch(datetime.datetime.utcnow())-time.time()))) - print(20*'X') + print(20 * 'X') + print(("Should be close to zero: %s" % + (datetime_to_epoch(datetime.datetime.utcnow()) - time.time()))) + print(20 * 'X') for input in [ '+2d', '+3w', @@ -114,4 +125,5 @@ if __name__ == '__main__': '2014-05-28T15:18', '2014-05-28T15:18:30', ]: - print("input=%20s -> parsed %s"%(input,datetime_to_string(utcparse(input)))) + print("input=%20s -> parsed %s" % + (input, datetime_to_string(utcparse(input))))