Package stocks3 :: Package share :: Module dateandtime
[hide private]
[frames] | no frames]

Source Code for Module stocks3.share.dateandtime

  1  # -*- coding: utf-8 -*- 
  2   
  3  u""" 
  4  Модуль содержит дополнительные функции для работы с датой и временем. 
  5  """ 
  6   
  7  __author__ = "Zasimov Alexey" 
  8  __email__ = "zasimov-a@yandex-team.ru" 
  9   
 10   
 11  import os, time 
 12  import re 
 13  from datetime import datetime 
 14  from datetime import timedelta 
 15   
 16   
 17  # Регулярное выражение для разбора строки с timedelta. 
 18  timedelta_re = re.compile(r'((?P<hours>\d+?)h)?((?P<minutes>\d+?)m)?((?P<seconds>\d+?)s)?') 
 19   
 20   
21 -def tzset(tz):
22 u""" 23 Устанавливает временную зону tz. 24 25 @param tz: Человеческое имя зона (например, Europe/Moscow). 26 """ 27 os.environ["TZ"] = tz 28 time.tzset()
29
30 -def with_tz(tz, func, *args):
31 u""" 32 Запускает функцию func в окружении с установленной временной зоной tz. 33 34 >>> with_tz("Asia/Nicosia", lambda x: time.timezone, None) 35 -7200 36 37 @param tz: Человеческое имя зоны (например, Europe/Moscow). 38 @param func: Функция для запуска. 39 @param args: Аргументы для функции func. 40 """ 41 tz_from_env = os.environ.get('TZ', None) 42 try: 43 tzset(tz) 44 return func(*args) 45 finally: 46 # Восстанавливаем предыдущую зону 47 if not tz_from_env: 48 del os.environ['TZ'] 49 else: 50 os.environ['TZ'] = tz_from_env 51 time.tzset()
52 53
54 -def delta_to_str(td, format="%H:%M:%S"):
55 u""" 56 Принимает на вход дельту td и конвертирует её в строку. 57 58 Формат берется из переменной format, в которой допускается использовать: 59 - %H - часы; 60 - %M - минуты; 61 - %S - секунды; 62 - %% - %; 63 Эти параметры выбраны для совместимости с L{time.strftime}. 64 65 Пример работы: 66 67 >>> t1 = datetime.today() 68 >>> t2 = datetime.today() + timedelta(hours=2, minutes=12, seconds=13) 69 >>> d = t2 - t1 70 >>> delta_to_str(d) 71 '2:12:13' 72 >>> delta_to_str(d, "%S:%M:%H") 73 '13:12:2' 74 >>> delta_to_str(d, "%H%Z%%") 75 '2%Z%' 76 >>> delta_to_str(d, "%S%") 77 '13%' 78 79 @type td: timedelta из модуля datetime 80 @param td: Делта. 81 @type format: строка формата 82 @param format: Формат результата. 83 """ 84 s = "" #: переменная с результатом 85 expect = True 86 87 hours = td.seconds // 3600 88 minutes = (td.seconds % 3600) // 60 89 seconds = (td.seconds % 3600) % 60 90 91 for c in str(format): 92 if expect: 93 if c == "%": 94 expect = False 95 else: 96 s += c 97 else: 98 expect = True 99 if c == "H": 100 s += str(hours) 101 elif c == "M": 102 s += str(minutes) 103 elif c == "S": 104 s += str(seconds) 105 elif c == "%": 106 s += "%" 107 else: 108 s += "%" + c 109 110 # Не забываем последний % 111 if not expect: 112 s += "%" 113 114 return s
115 116
117 -def _to_unixtime(dt):
118 return time.mktime(dt.timetuple())
119
120 -def to_unixtime(dt, tz=None):
121 u""" 122 Преобразует дату dt в U{unixtime <http://ru.wikipedia.org/wiki/UNIX-время>}. 123 124 Пример работы: 125 126 >>> tzset("Europe/Moscow") 127 >>> dt = datetime.strptime("07.07.2011 17:53:12", "%d.%m.%Y %H:%M:%S") 128 >>> to_unixtime(dt) 129 1310046792.0 130 >>> to_unixtime(dt, "Europe/London") 131 1310057592.0 132 133 @type dt: datetime 134 @param dt: Дата и время. 135 @type tz: человеческое имя временной зоны 136 @param tz: Временная зона, в которой задано время dt. Если время считается 137 заданным в системной временной зоне. 138 """ 139 assert isinstance(dt, datetime), "Expected datetime, but received %s" % dt.__class__ 140 if tz: 141 return with_tz(tz, _to_unixtime, dt) 142 else: 143 return _to_unixtime(dt)
144 145
146 -def str_to_timedelta(time_str):
147 u""" 148 Преобразует строчку вида XXhXXmXXs в timedelta. 149 150 Пример: 151 152 >>> dt = datetime.strptime("07.07.2011 17:53:12", "%d.%m.%Y %H:%M:%S") 153 >>> n = dt - str_to_timedelta("24h2m1s") 154 >>> n.strftime("%d.%m.%Y %H:%M:%S") 155 '06.07.2011 17:51:11' 156 157 @param time_str: Строчка с timedelta. 158 """ 159 global timedelta_re 160 parts = timedelta_re.match(time_str) 161 if not parts: 162 raise ValueError("Invalid timedelta format: %s" % s) 163 parts = parts.groupdict() 164 time_params = {} 165 for (name, param) in parts.iteritems(): 166 if param: 167 time_params[name] = int(param) 168 return timedelta(**time_params)
169