PHP: как разобрать год, состоящий из двух цифр, если дата окончания, принятая другим приложением, НЕ ЯВЛЯЕТСЯ "1969?"

Мы имеем дело с устаревшей базой данных (AS/400, RPG), в которой значения даты хранились с использованием двухзначного числа лет. Некоторое время назад было принято решение, что "любой год> =20" был 19xx... (Да, им сейчас очень весело, а компания была основана в конце 1920-х, так что для их рифмы действительно была причина.)

Я вижу, что PHP использует крайнюю дату 1969, так что всегда предполагается, что это "1970-2069".

Но... что, если я захочу это изменить? Что, если я захочу изменить это в зависимости от случая в моем приложении? Как мне поступать так? Я действительно ищу решение, которое в основном сообщало бы PHP использовать другую дату отсечения и, возможно, изменить способ выполнения расчетов по обе стороны от этой даты?

Конечно, мы знаем, что эти старые приложения придется переоборудовать, а в базах данных изменить представление значений даты, но это не так просто, как кажется. Нам нужны идеи, которые могли бы свести к минимуму количество кода на стороне PHP, который придется физически изменить. Итак, если вы непосредственно занимались подобной проблемой в прошлом, я хотел бы услышать, что вы решили сделать.

2 ответа

Не думаю, что для этого есть какое-то встроенное решение.

Что вам нужно сделать, так это проанализировать дату обычным образом, а затем проверить, находится ли год результата между 2020 и 2069. Если это так, вычтите 100 лет из даты, чтобы получить дату между 1920 и 1969.

Конечно, это означает, что вы не сможете иметь в базе данных даты, которые на самом деле относятся к 2019 году, до тех пор, пока вы не переформатируете ее для использования в четырехзначных годах. Это то, что компания должна была сделать более 20 лет назад, когда все были одержимы кризисом 2000 года.

Если вы не хотите перекомпилировать PHP, ответ - вы не можете.

Что вы можете сделать, так это использовать регулярное выражение, например preg_replace_callback('~<regex here>~', function($matches) { <return modified match here> }, $str); чтобы предварительно обработать дату в формате года с 4 символами, а затем проанализировать / сохранить ее в каноническом формате даты и времени.

Другие вопросы по тегам