БлогNot. PHP: Как организовать цикл по дням века или Даты-палиндромы

PHP: Как организовать цикл по дням века или Даты-палиндромы

Если не заморачиваться устаревшими решениями (для нашего потребуется версия PHP не ниже 5.2.0), проще всего создать два объекта DateTime, отмечающие начало и конец нужного периода времени, создать интервал DateInterval с нужным шагом по времени (необязательно один день) и организовать простой цикл, как в показанном ниже коде.

Чтобы код решал хоть какую-то задачку, заставим его заодно определить количество "палиндромных" дат в XXI веке (даты, которые читаются одинаково слева направо и справа налево, в отличие от "зеркальных дней", где мы понимали палиндромность даты иначе, с перестановкой цифр) и вывести их все.

Если век, как и положено, начинается с 1 января 2001-го года, день пишется без лидирующего нуля, а месяц - с лидирующим нулём, то для формата даты "день-месяц-год" у меня получилось 29 зеркальных дней, причём, последним из них будет 29 февраля:

10.02.2001 20.02.2002 
11.02.2011  1.10.2011 21.02.2012  2.10.2012  3.10.2013  4.10.2014   5.10.2015  6.10.2016  7.10.2017  8.10.2018  9.10.2019
12.02.2021 22.02.2022 
13.02.2031 23.02.2032 
14.02.2041 24.02.2042 
15.02.2051 25.02.2052 
16.02.2061 26.02.2062 
17.02.2071 27.02.2072 
18.02.2081 28.02.2082 
19.02.2091 29.02.2092 

Вот код скрипта, решающего задачу и показывающего пример организации цикла по дням на PHP:

<?php
 $start = new DateTime('2001-01-01');
 $end = new DateTime('2100-12-31');
 $interval = new DateInterval('P1D');
 $cnt = 0;
 do {
  $s = $start->format('jmY');
  if ($s==strrev($s)) {
   $cnt++; echo $start->format('j.m.Y').' ';
  }
  $start->add($interval);
 } while ($start<=$end);
 echo '<br>All: '.$cnt;
?>

Любопытно, что если день писать с лидирующим нулём ('dmY' вместо 'jmY' в формате даты), палиндромных дат всё равно будет 29 за век, но они будут не теми же:

10.02.2001 20.02.2002 
01.02.2010 11.02.2011 21.02.2012 02.02.2020 
12.02.2021 22.02.2022 03.02.2030 13.02.2031 23.02.2032 04.02.2040 
14.02.2041 24.02.2042 05.02.2050 
15.02.2051 25.02.2052 
06.02.2060 16.02.2061 26.02.2062 07.02.2070 
17.02.2071 27.02.2072 08.02.2080 
18.02.2081 28.02.2082 09.02.2090 
19.02.2091 29.02.2092 

Без лидирующих нулей и у дня, и у месяца (формат даты 'jnY'), "даты-перевёртыши" всё равно будут, но только 9 за весь век:

1.10.2011 2.10.2012 3.10.2013 4.10.2014 5.10.2015 6.10.2016 7.10.2017 8.10.2018 9.10.2019 

Наконец, если кому-то придёт в голову писать день с лидирующим днём, а месяц - нет ('dnY'), искомых дат, конечно, не будет совсем.

17.03.2019, 11:36 [2742 просмотра]


теги: php числа дата время форматы

К этой статье пока нет комментариев, Ваш будет первым