@YaVladimir
Меняю профиль работы, сейчас я юрист

Как организовать сравнение даты в переменной с форматом эталона?

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

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()
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
@YaVladimir Автор вопроса
Меняю профиль работы, сейчас я юрист
Посоветовали вот такую библиотеку использовать

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()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Документацию читать пробовал?
ValueError is raised if the date_string and format can’t be parsed by time.strptime() or if it returns a value which isn’t a time tuple

Если входная строка или строка формата не поддаются разбору вызовом time.strptime(), или если эта функция возвращает не кортеж с описанием даты-времени, функция выбрасывает исключение ValueError.

Учись обрабатывать исключения блоком try-except.
Впрочем, если судить вот по этому:
if res == True:
    ...
elif res == False:
    ...

Стоит вообще поучить язык, а потом уже браться за ботов. Это технически сработает, но выдаёт непонимание того, как работают логические переменные.
Правильнее будет
if res:
    ...
else:
    ...


Также задачу соответствия текста шаблону часто удобнее решать регулярными выражениями. Например:
import datetime
import re
# цифра, за ней может быть ещё одна, за ними "-", "/" или ".", 
# потом опять цифра, за ней может быть ещё одна, за ними "-", "/" или ".", 
# потом 2 или 4 цифры
regexp = re.compile(r'(\d\d?)[-/.](\d\d?)[-/.](\d{2}|\d{4})')
text = input('Введите дату в формате DD/MM/YYYY: ')
match = regexp.search(text)
if match is None:
    print('Вы ввели не дату, или ввели её в неправильном формате')
else:
    day, month, year = int(regexp.group(1)), int(regexp.group(2)), int(regexp.group(3))
    # тут нужна ещё проверка, так как пользователь может ввести 99/99/9999
    try:
        userdate = datetime.date(year, month, day)
    except ValueError:
        print('Это некорректная дата.')
    else:
        print('Дата корректна.')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы