1
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
18 timedelta_re = re.compile(r'((?P<hours>\d+?)h)?((?P<minutes>\d+?)m)?((?P<seconds>\d+?)s)?')
19
20
22 u"""
23 Устанавливает временную зону tz.
24
25 @param tz: Человеческое имя зона (например, Europe/Moscow).
26 """
27 os.environ["TZ"] = tz
28 time.tzset()
29
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
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
118 return time.mktime(dt.timetuple())
119
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
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