Как сделать проверку даты с полученного сообщения в telebot?

Рейтинг: 0Ответов: 1Опубликовано: 17.03.2023

Пытаюсь сделать проверку даты из входящего сообщения в эталонном формате, но выдает ошибку, когда дата введена не верно.

import telebot
import config
from datetime import datetime
bot = telebot.TeleBot(config.TOKEN) # Токен бота из файла кофигурации 

@bot.message_handler(commands=['start'])
def date_start(message):
    bot.send_message(message.chat.id, 'Введите дату формата ДД-ММ-ГГГГ')
    bot.register_next_step_handler(message, date_step_1)


def date_step_1(message):
    res = bool(datetime.strptime(message.text, '%d-%m-%Y'))
    if res == True:
        bot.send_message(message.chat.id, 'Спасибо, дата введена')
    elif res == False:
        bot.send_message(message.chat.id, 'Не верный формат даты, необходимо ДД-ММ-ГГГГ')


bot.infinity_polling()

Ошибка

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/telebot/__init__.py", line 955, in infinity_polling
    self.polling(non_stop=True, timeout=timeout, long_polling_timeout=long_polling_timeout,
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/telebot/__init__.py", line 1043, in polling
    self.__threaded_polling(non_stop=non_stop, interval=interval, timeout=timeout, long_polling_timeout=long_polling_timeout,
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/telebot/__init__.py", line 1118, in __threaded_polling
    raise e
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/telebot/__init__.py", line 1074, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/telebot/util.py", line 148, in raise_exceptions
    raise self.exception_info
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/telebot/util.py", line 91, in run
    task(*args, **kwargs)
  File "/Users/vladimir/Library/Mobile Documents/com~apple~CloudDocs/Documents/Хобби/Bot on python/date_ex.py", line 40, in date_step_1
    res = bool(datetime.strptime(message.text, '%d-%m-%Y'))
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data 'Mmm' does not match format '%d-%m-%Y'
"

Ответы

▲ 0Принят

Ошибка возникает из-за того, что вы пытаетесь распарсить дату в формате '%d-%m-%Y', но передаете в функцию 'datetime.strptime' строку, которая не соответствует данному формату.

Чтобы решить эту проблему, вам необходимо добавить проверку на корректность введенной пользователем даты перед вызовом функции 'datetime.strptime'. Можно использовать модуль 'dateutil' для автоматического определения формата даты, который введен пользователем.

import telebot
import config
from datetime import datetime
from dateutil.parser import parse

bot = telebot.TeleBot(config.TOKEN)

@bot.message_handler(commands=['start'])
def date_start(message):
    bot.send_message(message.chat.id, 'Введите дату формата ДД-ММ-ГГГГ')
    bot.register_next_step_handler(message, date_step_1)

def date_step_1(message):
    try:
        date = parse(message.text)
        bot.send_message(message.chat.id, 'Спасибо, дата введена')
    except ValueError:
        bot.send_message(message.chat.id, 'Не верный формат даты, необходимо ДД-ММ-ГГГГ')

bot.infinity_polling()