Первый вариант: на основе словаря, более быстрый вариант:
import datetime
import time
def time_of_day_dict(dt=None, ts=None, tod_dict=None):
'''
Принимает объект datetime (dt) или timestamp (ts), и словарь tod_dict {час : наименование времени}
Возвращает строку c временем суток.
При отсутствии аргументов - возвращает строку с текущим временем суток.
Словарь по умолчанию:
{0: 'ночь', 1: 'ночь', 2: 'ночь',
3: 'раннее утро', 4: 'раннее утро', 5: 'раннее утро',
6: 'утро', 7: 'утро', 8: 'утро',
9: 'первая половина дня', 10: 'первая половина дня', 11: 'первая половина дня',
12: 'обед', 13: 'обед', 14: 'обед',
15: 'после обеда', 16: 'после обеда', 17: 'после обеда',
18: 'вечер', 19: 'вечер', 20: 'вечер',
21: 'поздний вечер', 22: 'поздний вечер', 23: 'поздний вечер' }
Eсли час не отражен в словаре, возвращает None
Требует import datetime
N.B. ф-я в 2-3 раза быстрее, чем ф-я time_of_day()
'''
# определение словаря
if tod_dict:
pass
else:
tod_dict = {0: 'ночь', 1: 'ночь', 2: 'ночь',
3: 'раннее утро', 4: 'раннее утро', 5: 'раннее утро',
6: 'утро', 7: 'утро', 8: 'утро',
9: 'первая половина дня', 10: 'первая половина дня', 11: 'первая половина дня',
12: 'обед', 13: 'обед', 14: 'обед',
15: 'после обеда', 16: 'после обеда', 17: 'после обеда',
18: 'вечер', 19: 'вечер', 20: 'вечер',
21: 'поздний вечер', 22: 'поздний вечер', 23: 'поздний вечер'}
# определение оцениваемого времени
if dt:
if isinstance(dt, datetime.datetime):
dt = dt
else:
print('некорректный формат dt: %s \n требуется объект datetime.datetime' % (type(dt)))
return None
elif ts:
if isinstance(ts, (int, float)):
if ts > 0:
dt = datetime.datetime.fromtimestamp(ts)
print(dt.ctime())
else:
print('отрицательное значение ts недопустимо')
return None
else:
print('некорректный формат ts: %s \n требуется значение int или float' % (type(ts)))
return None
else:
dt = datetime.datetime.now()
h = dt.hour
# подбор
if h in tod_dict:
tod = tod_dict[h]
return tod
else:
print('Значение времени отсутствует в словаре')
return None
Второй вариант, как пример того, как делать не надо ))
def time_of_day(dt=None, ts=None, tod_dict=None):
'''
Принимает объект datetime (dt) или timestamp (ts), и словарь tod_dict
{наименование времени : час окончания(включительно)}
Возвращает строку c временем суток
При отсутствии аргументов - возвращает строку с текущим временем суток.
Словарь по умолчанию:
{'ночь' : 3, 'раннее утро' : 6, 'утро' : 9, 'первая половина дня' : 12,
'обед' : 15, 'после обеда' : 18, 'вечер' : 21, 'поздний вечер' : 24, }
Если час не отражен в словаре, возвращает None
Требует import datetime
'''
# определение словаря
if tod_dict:
pass
else:
tod_dict = {'ночь': 3, 'раннее утро': 6, 'утро': 9, 'первая половина дня': 12,
'обед': 15, 'после обеда': 18, 'вечер': 21, 'поздний вечер': 24, }
sorted_tod = sorted(tod_dict.items(), key=lambda x: x[1], reverse=False)
# print(sorted_tod)
# определение оцениваемого времени
if dt:
if isinstance(dt, datetime.datetime):
dt = dt
else:
print('некорректный формат dt: %s \n требуется объект datetime.datetime' % (type(dt)))
return None
elif ts:
if isinstance(ts, (int, float)):
if ts > 0:
dt = datetime.datetime.fromtimestamp(ts)
print(dt.ctime())
else:
print('отрицательное значение ts недопустимо')
return None
else:
print('некорректный формат ts: %s \n требуется значение int или float' % (type(ts)))
return None
else:
dt = datetime.datetime.now()
h = dt.hour
# подбор
for time in sorted_tod:
if h <= time[1]:
tod = time[0]
return tod
print('Значение времени отсутствует в словаре')
return None