Определение даты: Онлайн калькулятор: Дата и количество дней

Определение точности даты начала и окончания для проекта в Учете проектов — Dynamics GP

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

В этой статье описывается, как определить, являются ли даты начала и окончания точными для проекта в окне обслуживания проекта в Project Accounting for Microsoft Dynamics GP.

Применимо к: Microsoft Dynamics GP
Исходный номер базы знаний: 929784

Аннотация

Значения в поле «Дата начала» и «Дата окончания» для проекта в окне обслуживания проекта являются производными от даты начала и последней даты окончания в следующих окнах:

  • Запись с подробными сведениями о бюджете
  • Расписание оплаты
  • Сведения о плате

Чтобы определить, являются ли дата начала и конечная дата точными для проекта, просмотрите сведения в каждом из этих окон.

Окно ввода подробных данных о бюджете

Найдите даты начала и окончания бюджета, связанного с проектом. Для этого выполните следующие действия:

  1. В меню «Карточки » наведите указатель мыши на проект и выберите пункт «Проект».
  2. Введите номер проекта в поле «Проект Нет» и нажмите кнопку » Бюджет».
  3. В окне «Обслуживание бюджета» выберите категорию затрат и щелкните стрелку расширения рядом с полем «Категория затрат «.

Откроется окно ввода подробных данных о бюджете. В окне «Бюджетные сведения о бюджете» отображаются следующие даты начала и окончания бюджета.

Дата началаДата окончания
ScheduledДата началаДата окончания
ForecastДата началаДата окончания
ФактическиеДата началаДата окончания

В учете проектов для определения даты начала и окончания проекта используются прогнозируемая дата начала и дата окончания.

Окно расписания оплаты

Найдите даты начала и окончания расписания сбора, связанного с проектом. Для этого выполните следующие действия:

  1. В меню «Карточки » наведите указатель мыши на проект и выберите пункт «Проект».

  2. Введите номер проекта в поле «Проект Нет » и нажмите кнопку » Сборы».

    Откроется окно ввода платы. В этом окне отображаются все платежи, связанные с проектом.

  3. В окне «Запись с оплатой» выберите каждую плату и нажмите кнопку расширения рядом

    с полем «Частота», чтобы открыть окно «Расписание сбора». Даты расписания сбора отображаются в окне расписания сбора.

Окно сведений о плате

Найдите даты начала и даты окончания сведений о плате, связанных с проектом. Для этого выполните следующие действия:

  1. В меню «Карточки » наведите указатель мыши на проект и выберите пункт «Проект».

  2. Введите номер проекта в поле «Проект Нет » и нажмите кнопку » Сборы».

    Откроется окно ввода платы. В этом окне отображаются все платежи, связанные с проектом.

  3. В окне «Запись с оплатой» выберите каждую плату и нажмите кнопку расширения рядом

    с полем «Идентификатор сбора», чтобы открыть окно «Сведения о плате».

Для оплаты отображаются даты начала и окончания.

Определение плановой даты поступления

 

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

Примечание

Циклы по изделию могут быть определены в сеансах Изделия — Контрагент по закупкам (tdipu0110m000) и Логистические данные строки контракта на закупку (tdpur3102m000).

Горизонт рассчитывается исходя из поля Горизонт цикла (дней) в сеансе Изделия — Контрагент по закупкам (tdipu0110m000) или Логистические данные строки контракта на закупку (tdpur3102m000).

Для рассчета запланированной даты поступления, выберите Расчет в сеансе Строки заказа на закупку (tdpur4101m000) или Строки графика закупок (tdpur3111m000).

LN показывает запланированную дату поступления в поле Запланир.дата заявки этих сеансов.

Определение горизонта

LN задает горизонт, добавляя горизонт времени реализации заказа к текущей дате и времени с учетом календаря компании, с которым связан тип доступности. LN сравнивает дату генерации/ заказа с этим горизонтом, что приводит к одному из следующих вариантов:

  • Дата заказа/генерации лежит за пределами горизонта. В связи с этим, запланированная дата поступления задается на общем уровне.
  • Дата заказа/генерации лежит в пределах или до горизонта. В связи с этим, запланированная дата поступления задается точно.

Примечание

  • Горизонт времени реализации заказа всегда выражается в днях.
  • Календарь компании является календарем, который связан с компанией в сеансе Компании (tcemm1170m000).

Пример Определение горизонта

Текущие дата/время: Среда, 10 марта/15:00:00
Календарь компании для типа доступности Управление закупками имеет начальный момент в 8:00:00 и конечный момент в 16:00:00 и действует с понедельника по пятницу каждую неделю.
Горизонт цикла (в днях): 10

 

Поскольку в среду доступен один час, среда считается целым днём. Итак, в течение первой недели доступны три дня. В течение следующей недели доступно пять дней. Следовательно, два дня остаются на третью неделю. Поскольку LN находит подходящее время во вторник, 23 марта, этот день считается целым днём и LN берёт последний подходящий день за границу горизонта. Итак, горизонтом является вторник, 23 марта/16:00:00.

Дата заказа/генерации за пределами горизонта

Если дата заказа/генерации лежит за пределами горизонта, LN рассматривает заказ на закупку/график закупок как прогнозируемое требование, для которого пока не требуется точного определения плановой даты поступления.

LN задаёт плановую дату поступления следующим образом, учитывая календарь компании:

Дата заказа/генерации + расчётное время цикла заказа

LN берет расчётное время цикла заказа из поля Расчетн. время цикла (дней) сеанса Изделия — Контрагент по закупкам (tdipu0110m000) или Логистические данные строки контракта на закупку (tdpur3102m000). За дополнительной информацией обратитесь к Расчет цикла заказа закупаемого изделия.

Примечание

  • Расчётное время цикла заказа всегда выражается в днях.
  • До начальное даты календаря компании и после конечной даты календаря компании, LN использует стандартный календарь.

Пример даты заказа/генерации за пределами:

Дата заказа/генерации: Четверг, 25 марта /17:00:00
Расчётное время цикла заказа (в днях): 5
Календарь компании для типа доступности Управление закупками имеет начальный момент в 8:00:00 и конечный момент в 16:00:00 и действует с понедельника по пятницу каждую неделю.

 

Поскольку четверг, 25 марта /17:00:00 является не доступной, согласно календарю, датой/временем, LN ищет первую подходящую дату/время, к которой вычисленное время реализации заказа необходимо прибавить, а именно, пятницу, 26 марта/8:00:00. Итак, четыре дня остаются на следующую неделю. Поскольку LN находит подходящее время на четвёртый день, четверг, 1 апреля, этот день считается целым днём и LN берёт последнее подходящее время в качестве плановой даты поступления. Итак, плановая дата поступления — четверг, 1 апреля/16:00:00.

Дата заказа/генерации в пределах горизонта

Если дата заказа/генерации лежит в пределах или до горизонта, LN рассматривает заказ на закупку/график закупки как непосредственное требование, для которого требуется точное определение плановой даты поступления. Следовательно, LN определяет плановую дату поступления, складывая компоненты времени реализации заказа, с учётом связанных календарей для каждой компоненты.

LN определяет плановую дату поступления следующим образом:

Дата заказа/генерации + время внутренней обработки + время поставки + время транспортировки + резерв времени. 

LN извлекает дату заказа/генерации и компоненты времени цикла заказа следующим образом:

  • Дата заказа из поля Дата заказа в сеансе Строки заказа на закупку (tdpur4101m000).
  • Дата генерации из поля Дата генерации в сеансе Графики закупок (tdpur3110m000).
  • Время внутр.обработки из поля Время внутр.обраб. в сеансе Изделия — Контрагент по закупкам (tdipu0110m000) или Логистические данные строки контракта на закупку (tdpur3102m000).
  • Резервное время из поля РезервВрем. в сеансе Изделия — Контрагент по закупкам (tdipu0110m000) или Логистические данные строки контракта на закупку (tdpur3102m000).
  • Время поставки из поля Время поставки в сеансе Изделия — Контрагент по закупкам (tdipu0110m000) или Логистические данные строки контракта на закупку (tdpur3102m000).
  • Время перевозки из поля Время перевозки (дней) в сеансе Изделия — Контрагент по закупкам (tdipu0110m000) или Логистические данные строки контракта на закупку (tdpur3102m000).

Путь поиска календаря

При определении плановой даты поступления, LN также учитывает календари, которые связаны с компонентами времени реализации заказа. LN ищет календари, которые связаны с компонентами времени реализации заказа, следующим образом:

  1. Время внутр.обработки

    Если отдел закупок указан для комбинации изделие и поставщик, а календарь определён для отдела закупок, LN учитывает календарь отдела закупок. Вы можете указать календарь отдела закупок в сеансе Подразделения (tcmcs0565m000).

  2. Если календарь для отдела закупок не определён или отдел закупок не указан, LN учитывает календарь компании.
  1. Время поставки

    Если грузоотправитель указан и календарь грузоотправителя определён, LN учитывает календарь грузоотправителя.

  2. Если ни один календарь контрагента-грузоотправителя не доступен, LN учитывает календарь контрагента-поставщика.
  3. Если ни один календарь контрагента-поставщика не доступен, LN учитывает календарь компании.
  1. Время перевозки

    Если перевозчик указан, поставщик связан с перевозчиком, а календарь поставщика известен, LN учитывает календарь контрагента-поставщика.

  2. Если перевозчик указан, поставщик связан с перевозчиком, но календарь поставщика не определён, LN учитывает календарь компании.
  3. Если перевозчик указан, но поставщик не связан с перевозчиком, LN учитывает календарь компании.
  4. Если перевозчик не определен, LN учитывает календарь компании.
  1. Резервное время

    Если грузоотправитель указан и календарь грузоотправителя определён, LN учитывает календарь грузоотправителя.

  2. Если ни один календарь контрагента-грузоотправителя не доступен, LN учитывает календарь контрагента-поставщика.
  3. Если ни один календарь контрагента-поставщика не доступен, LN учитывает календарь компании.

LN ищет действительные календари на основе следующих вещей:

  • Календарь, который связан с компонентой времени реализации заказа.
  • Тип доступности Управления закупками.
  • Тип доступности для обработки товарно-материальных ценностей.
  • Начальная дата и конечная дата календаря.

Примечание

  • Вы можете выразить компоненты времени реализации заказа в часах и днях.
  • Вы можете указать тип доступности Управления закупками в сеансе Параметры закупок (tdpur0100m000).
  • Вы можете указать тип доступности для перевозки товаров в поле Тип доступности для перевозки товаров в сеансе Параметры COM (Общие данные) (tccom0000s000).
  • До начальной даты применяемого календаря и после конечной даты календаря, LN использует стандартный календарь.

Пример даты заказа/генерации в пределах или после горизонта

Дата заказа/генерации:Пятница, 12 марта /7:00:00
Время внутренней обработки (в часах):6
Время поставки (в днях):1
Время транспортировки (в днях):2
Резерв времени (в часах):4

 

Календарь компании для типа доступности Управления закупками и для Тип доступности для перевозки товаров имеет начальный момент в 8:00:00 и конечный момент в 16:00:00 и действует с понедельника по пятницу каждую неделю. Календарь компании для типа доступности Управления закупками и для Тип доступности для перевозки товаров имеет начальный момент в 8:30:00 и конечный момент в 16:30:00 и действует с понедельника по пятницу каждую неделю. Календарь грузоотправителя для типа доступности Управления закупками имеет начальный момент в 9:00:00 и конечный момент в 17:00:00 и действует с понедельника по пятницу каждую неделю.

LN определяет плановую дату поступления следующим образом:

  1. LN добавляет время внутренней обработки к дате заказа/генерации, учитывая календарь компании. Поскольку пятница, 12 марта/7:00:00, является неподходящим днём/временем согласно календарю компании, LN ищет первый рабочий день/время, к которому можно добавить время внутренней обработки, а это пятница, 12 марта/8:00:00.
  2. LN добавляет время внутренней обработки к пятнице, 12 марта/8:00:00. Результирующие дата/время — пятница, 12 марта/14:00:00.
  3. LN добавляет время поставки к пятнице, 12 марта/14:00:00, учитывая календарь компании. В соответствии с календарем компании в пятницу, 12 марта, остаётся 2 часа. Так как время поставки выражается в днях, LN считает пятницу, 12 марта, за целый день. Итак, результирующие дата/время — пятница, 12 марта/16:00:00.
  4. LN добавляет время транспортировки к пятнице, 12 марта/16:00:00, учитывая календарь поставщика. В соответствии с календарём поставщика, в пятницу, 12 марта, остается полчаса. Так как время поставки выражается в днях, LN считает пятницу, 12 марта, за целый день. Вторым днем транспортировки является первый рабочий день после пятницы, 12 марта, который приходится на понедельник, 15 марта. Итак, результирующие дата/время — пятница, 15 марта/16:30:00.
  5. LN добавляет резерв времени в понедельник, 15 марта/16:30:00, с учётом календаря грузоотправителя. В соответствии с календарем грузоотправителя, в понедельник, 15 марта, остается полчаса. Оставшиеся 3,5 часа добавлены ко вторнику, 16 марта, начиная с 9:00:00. Итак, результирующие дата/время — вторник, 16 марта/12:30:00, которая является плановой датой поступления.

Примечание

Если при вводе строки заказа на закупку ни одной даты не указано для изделия в сеансе Изделия — Контрагент по закупкам (tdipu0110m000), LN определяет запланированную дату поступления, используя только время поставки из сеанса Изделия — Закупки (tdipu0101m000). За дополнительной информацией обратитесь к Определение плановой даты поступления только на основе времени поставки.

 

 
   

Определение даты обнаружения | Law Insider

  • означает дату, когда генерирующая установка в регионе PJM либо выводится из эксплуатации, либо законсервируется и прекращает работу.

  • означает дату, когда MLBFS должна обеспечить полную активацию Кредитной линии WCMA в компьютерной системе MLPF&S в рамках Программы WCMA.

  • означает дату, наступающую после Даты утверждения, когда Присоединение осуществляется Присоединяющимися сторонами;

  • означает: (a) в отношении услуг Интернета, передачи данных и голосовой связи в сети дату, когда концентратор и телефонные каналы готовы к маршрутизации пакетов или ячеек на Объект Заказчика; (b) в отношении внесетевых голосовых услуг – дата предоставления идентификации вызывающей линии; (c) в отношении других Услуг, самая ранняя из следующих дат: (i) дата, указанная в соответствующем Приложении к услуге или Заказе на услугу, (ii) дата, когда Verizon информирует Клиента о том, что Услуги готовы к использованию, (iii) дата, когда Клиент впервые использует Услуги или (iv) для услуг развертывания CPE в соответствии с Дополнением об услугах CPE, дату завершения процесса принятия развертывания и требований к подписи Клиента, указанных в нем; и (d) в случае продления существующих Услуг, Дату начала.

  • означает дату, указанную в Техническом задании, к которой Подрядчик должен подготовить (сертифицировать) заказанное Оборудование для использования государством.

  • Дата, следующая за Датой прекращения действия, когда Совокупная невыплаченная сумма была уменьшена до нуля и полностью выплачена в неотъемлемом порядке.

  • означает дату завершения строительства совместного объекта Договоренности о присоединении, создания групп магистралей, завершения испытаний совместной магистрали и взаимной приемки магистралей Сторонами.

  • означает дату, когда Перевозчик, получив соответствующую информацию от Компании, может и согласен начать предоставление Услуг фиксированной сети Клиенту;

  • означает любой механический узел, установленный на водопроводной линии или водопроводной арматуре для предотвращения загрязнения обратным потоком, при условии, что механический узел подходит для идентифицированного загрязнителя в перекрестном соединении и может быть испытан в полевых условиях. сборка.

  • означает предохранительное устройство, используемое для предотвращения загрязнения или засорения водопровода из-за обратного потока воды из оросительной системы.

  • означает в отношении каждой Ипотечной ссуды дату Ипотечной расписки, относящейся к такой Ипотечной ссуде, если такая информация не предоставлена ​​Заемщиком в отношении такой Ипотечной ссуды, и в этом случае Датой предоставления считается считается датой, наступающей за 40 дней до даты первого платежа по Ипотечному векселю, относящемуся к такому Ипотечному кредиту.

  • означает в отношении каждой Новой учетной записи дату создания такой Новой учетной записи.

  • означает в отношении Заказа на покупку дату, указанную в Разделе 2.3(а), а в отношении Заказа на погашение — дату, указанную в Разделе 2.6(а).

  • означает дату Базового проспекта, применимого к Программе. «Программные документы» означает:

  • означает предпоследний рабочий день месяца.

  • означает 30 дней с даты выписки по Счету (см. раздел 6.3).

  • означает каждую из следующих Дат наблюдения:

  • означает в отношении события прекращения индекса SOFR дату, когда FRBNY (или любой правопреемник SOFR) прекращает публиковать SOFR, или дата, с которой SOFR больше нельзя использовать.

  • означает первый Рабочий день, предшествующий первому дню Дивидендного периода.

  • означает дату, когда Существенный проект в основном завершен и готов к коммерческой эксплуатации.

  • означает, в отношении события прекращения действия индекса OBFR, дату, когда FRBNY (или любой правопреемник администратора OBFR) прекращает публиковать OBFR, или дату, с которой OBFR больше нельзя использовать. .

  • В отношении любой Даты распределения – 10-й календарный день месяца, в котором наступает такая Дата распределения, или, если такой 10-й день не является Рабочим днем, Рабочий день, следующий за таким 10-м днем; при условии, однако, что в отношении WMMSC Дата передачи данных должна быть не позднее 12:00, за пять рабочих дней до соответствующей Даты распространения.

  • означает дату, когда составляется ежемесячная выписка и списывается со счета клиента.

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

  • или «ПРИЛОЖЕНИЕ» означает дату, когда CLEC предоставляет Qwest приложение для обслуживания, содержащее необходимую информацию, как указано в настоящем Соглашении.

  • означает день, на который запланирован первый этап физической Обработки, как указано в Подтверждении.

datetime — определение даты с помощью Python RegEx

Задавать вопрос

спросил

Изменено 2 года, 1 месяц назад

Просмотрено 1к раз

\$\начало группы\$

это практический проект из книги «Автоматизация скучных вещей с помощью Python». я программист Python среднего уровня, и я попытался решить эту проблему с меньшим количеством кода, насколько это возможно. Этот код не будет принимать во внимание неправильную дату, например: 29-02-2002 не будет выбрано, потому что 2002 год не високосный и только високосные годы имеют 29 февраля. я не добавлял код, чтобы также определять даты с месяцами, написанными словами, я тоже мог бы сделать это, но я хочу, чтобы все было просто, и я также не использовал модуль pyperclip для определения дат из скопированного текста в буфер обмена, потому что я не хочу запутать любого новичка, который также хочет учиться, наблюдая за моим кодом. Я хочу, чтобы мастера-программисты просмотрели мой код, и если у них есть другой способ определить даты, пожалуйста, опубликуйте свои решения. Также я был бы признателен за любые советы и положительную критику, поэтому я знаю, где я сейчас нахожусь и что мне нужно улучшить. Спасибо. Код выглядит следующим образом:

 импорт повторно
    определение даты_детектора (текст):
        date_pattern = перекомпилировать ('''
        ([12][0-9]|3[0-1]|0?[1-9]) # для определения дней с 1 по 31
        ([. /-]) # для обнаружения различных разделений
        (1[0-2]|0?[1-9]) # для определения количества месяцев
        ([./-]) # для обнаружения различных разделений
        (2?1?[0-9][0-9][0-9]) # для определения количества лет от 1000 до 2999 лет
         ''', re.VERBOSE)
        дней = []
        месяцы = []
        лет = []
        даты = []
        для даты в date_pattern.findall (текст):
            days.append (int (дата [0]))
            месяцы.добавление(целое(дата[2]))
            лет.добавление(целое(дата[4]))
        для числа в диапазоне (длина (дни)):
        # добавление дат в список, который не нуждается в какой-либо фильтрации для обнаружения неправильных дат
            если месяцев [число] не в (2, 4, 6, 9, 11):
                date.append([дни[число], месяцы[число], годы[число]])
        # определение дат с месяцами, в которых всего 30 дней
            elif days[num] < 31 и month[num] в (4, 6, 9, 11):
                date.append([дни[число], месяцы[число], годы[число]])
        # фильтрация високосных лет с февральскими месяцами, в которых 29 дней
            Элиф месяцев [число] == 2 и дней [число] == 29:
                если годы [число] % 4 == 0:
                    если годы [число] % 100 == 0:
                        если годы [число] % 400 == 0:
                            date. append([дни[число], месяцы[число], годы[число]])
                    еще:
                        date.append([дни[число], месяцы[число], годы[число]])
        # добавляем даты февраля, в которых меньше 29дни
            elif month[num] == 2 и days[num] < 29:
                date.append([дни[число], месяцы[число], годы[число]])
        если len(даты) > 0:
            для даты в датах:
                Дата печати)
data = '30-06-2012, 31-12-2012, 15-02-2002, 29-02-2004, 29-02-2002, 31-02-2004, 31-06-2012'
date_detector (данные)
```
 
  • python-3.x
  • datetime
  • регулярное выражение
  • обнаружение объекта

\$\конечная группа\$

\$\начало группы\$

Я предлагаю несколько незначительных улучшений в регулярном выражении:

  • убедитесь, что один и тот же разделитель используется между днем ​​и месяцем и между месяцем и годом с обратной ссылкой (?P=sep) ,
  • заменить нумерованные группы захвата на именованные, а ненужные группы, если они были, сделать не захватывающими на ?: . Следовательно, используются finditer и groupdict , а день получается из совпадения с int(date['day']) и т. д. Это сделает код более человечным.

Что еще более важно, я предлагаю вам полностью избавиться от списков дней , месяцев и лет . Эти данные могут храниться в словарях в списке дат и фильтроваться перед добавлением к датам .

Как следствие, вам не понадобится цикл по range(len(days)) .

Условия валидации можно объединить по ИЛИ без потери ясности, и я предлагаю сделать это отдельной функцией date_is_valid(день: int, месяц: int, год: int) -> bool .

Кроме того, единственный параметр в date_detector можно сделать типизированным: def date_detector(text: str): .

Суммируя предлагаемые модификации:

 импортный
def date_is_valid (день: int, месяц: int, год: int) -> bool:
    return (месяц не в (2, 4, 6, 9, 11) # 31 день в месяце (январь, март, май, июль, август, октябрь, декабрь). 
    или день < 31 и месяц в (4, 6, 9, 11) # 30 дней в месяце (февраль, апрель, июнь, сентябрь, ноябрь).
    или месяц == 2 и день == 29и год % 4 == 0 и (год % 100 != 0 или год % 400 == 0)
                                            # 29 февраля в високосном году по григорианскому календарю.
    или месяц == 2 и день < 29) # 1-28 февраля.
def date_detector (текст: ул):
    date_pattern = перекомпилировать ('''
    (?P[12][0-9]|3[0-1]|0?[1-9]) # для определения дней с 1 по 31
    (?P[./-]) # для обнаружения различных разделений
    (?P1[0-2]|0?[1-9]) # для определения количества месяцев
    (?P=sep) # для обнаружения различных разделений
    (?P<год>2?1?[0-9][0-9][0-9]) # для определения количества лет от 1000 до 2999 лет
     ''', re.VERBOSE)
    даты = []
    для совпадения в date_pattern.finditer(text):
        date = match.groupdict() # преобразовать объект Match в словарь.
        del date['sep'] # разделитель нам больше не нужен.
        date = {key: int(val) for key, val in date. items()} # применить int() ко всем элементам.
        
        if date_is_valid(дата['день'], дата['месяц'], дата['год']):
            date.append(дата)
    если len(даты) > 0:
        для даты в датах:
            Дата печати)
данные = '30-06-2012, 31-12-2012, 15-02-2002, 29-02-2004, 29-02-2002, 31-02-2004, 31-06-2012'
date_detector (данные)
```
 

\$\конечная группа\$

\$\начало группы\$

Я знаю, что это часть упражнения, но мне кажется, что нужно заново изобретать колесо, когда вы можете использовать встроенные возможности Python для проверки даты:

 из даты импорта даты и времени
>>> date(2020, 2, 29) # работает дата високосного года
datetime.date(2020, 2, 29)
>>> date(2002, 2, 29) # невисокосный год вызовет ValueError
ValueError: день выходит за пределы допустимого диапазона для месяца
>>> дата(2002, 9, 31) # 31-й день вызовет ValueError
ValueError: день выходит за пределы допустимого диапазона для месяца
 
  • Вместо создания 3 отдельных списков для лет , месяцев и дней вы можете создать только один список, так как вы всегда получаете доступ к этим частям по одному и тому же индексу. Это также упрощает цикл для , который дает вам значения напрямую, а не дает вам индекс, к которому вы хотите получить доступ в этих списках.

  • Python — это динамический язык, в котором пустые коллекции оцениваются как False , поэтому, когда вы хотите проверить, есть ли в списке какие-либо элементы, вам не нужно делать это явно через , если len(list) > 0 , но вы можете сделать , если list: . Для печати элементов в списке вы можете сделать еще один шаг и полностью опустить условие, поскольку итерация по пустому списку ничего не напечатает. Фрагмент до/после:

 # до
если len(даты) > 0:
    для даты в датах:
        Дата печати)
# после
для даты в датах:
    Дата печати)
 

применяются все предложения:

 импортировать повторно
с даты импорта datetime
определение даты_детектора (текст):
    date_pattern = перекомпилировать ('''
    ([12][0-9]|3[0-1]|0?[1-9]) # для определения дней с 1 по 31
    ([. /-]) # для обнаружения различных разделений
    (1[0-2]|0?[1-9]) # для определения количества месяцев
    ([./-]) # для обнаружения различных разделений
    (2?1?[0-9][0-9][0-9]) # для определения количества лет от 1000 до 2999 лет
        ''', re.VERBOSE)
    # использовать только один список для хранения всех частей совпадения вместе
    проанализировано = []
    для совпадения в date_pattern.findall (текст):
        # год, месяц, день для более удобного перехода к date()
        parsed.append([ int(match[4]), int(match[2]), int(match[0])] )
    действительный = []
    для элемента в разборе:
        пытаться:
            # передать список [год, месяц, день] в date() и позволить ему проверить его достоверность для нас
            дата(*элемент)
        кроме ValueError как e:
            pass # неверная дата, ничего не делайте
        еще:
            действительный .append (элемент)
    для элемента в силе:
        печать (элемент)
данные = '30-06-2012, 31-12-2012, 15-02-2002, 29-02-2004, 29-02-2002, 31-02-2004, 31-06-2012'
date_detector (данные)
 
  • это можно еще больше упростить, объединив оба цикла и вместе, чтобы не повторять сбор данных дважды без необходимости.

Оставьте комментарий