Форумы портала PHP.SU » PHP » Пользовательские функции » LibDateTime()

Страниц (1): [1]
 

1. GoDr - 15 Января, 2015 - 12:42:50 - перейти к сообщению
часто приходится использовать операции с датами, вот и написал для своих проектов небольшую библиотеку. Простая в обращении, самые необходимые методы. Конечно там только самое необходимое, но всегда можно расширить Хорошо

Требование простое: PHP >= 5.2.0 (но лучше >=5.3)

Методы:
    Возвращает дату в формате [12 декабря 2014 года]
    Возвращает разницу дат
    Прибавляет интервал к дате
    Отнимает интервал от дате
    Преобразует дату в нужный формат
    Возвращает выпадающий список дней месяца
    Возвращает выпадающий список месяцев
    Возвращает выпадающий список годов


PHP:
скопировать код в буфер обмена
  1. /**
  2.  * Класс для работы с Датой и Временем
  3.  * @package   LibDateTime
  4.  * @version   1.1
  5.  * @author    Gold Dragon <illusive@bk.ru>
  6.  * @link      http://gd.lotos-cms.ru
  7.  * @copyright Авторские права (C) 2000-2015, Gold Dragon
  8.  * @date      01.01.2015
  9.  * @see       http://wiki.lotos-cms.ru/index.php/LibDateTime
  10.  * @license   MIT License: http://opensource.org/licenses/MIT
  11.  */
  12. class LibDateTime
  13. {
  14.     /** @var array : название месяцев (именительный падеж) */
  15.     private static $MONTH_NAME_I = array(
  16.         "---------",
  17.         "Январь",
  18.         "Февраль",
  19.         "Март",
  20.         "Апрель",
  21.         "Май",
  22.         "Июнь",
  23.         "Июль",
  24.         "Август",
  25.         "Сентябрь",
  26.         "Октябрь",
  27.         "Ноябрь",
  28.         "Декабрь");
  29.  
  30.     /** @var array : название месяцев (родительный падеж) */
  31.     private static $MONTH_NAME_R = array(
  32.         "---------",
  33.         "января",
  34.         "февраля",
  35.         "марта",
  36.         "апреля",
  37.         "мая",
  38.         "июня",
  39.         "июля",
  40.         "августа",
  41.         "сентября",
  42.         "октября",
  43.         "ноября",
  44.         "декабря");
  45.  
  46.     /** @var array : суффикс для года */
  47.     private static $SUFFIX = array("", "г.", "года");
  48.  
  49.     /**
  50.      * Возвращает дату в формате [12 декабря 2014 года]
  51.      *
  52.      * @param datetime|null $date   : дата в любом форматие
  53.      * @param int           $suffix : выводить ли слово после даты
  54.      *                              0 - нет (по умолчанию)
  55.      *                              1 - короткая форма
  56.      *                              2 - длинная форма
  57.      *
  58.      * @return string : дата
  59.      *
  60.      * @example:
  61.      *         echo LibDateTime::getDateName('01.01.2015');
  62.      *         echo LibDateTime::getDateName('01.01.2015', 2);
  63.      */
  64.     public static function getDateName($date = null, $suffix = 0)
  65.     {
  66.         if (empty($date)) {
  67.             $date = date('d.m.Y');
  68.         }
  69.  
  70.         $suffix = intval($suffix);
  71.  
  72.         if ($suffix < 0 or $suffix > 2) {
  73.             $suffix = 0;
  74.         }
  75.  
  76.         $result[] = self::formatDate($date, 'd');
  77.         $result[] = self::$MONTH_NAME_R[self::formatDate($date, 'n')];
  78.         $result[] = self::formatDate($date, 'Y');
  79.         $result[] = self::$SUFFIX[$suffix];
  80.  
  81.         return trim(implode(' ', $result));
  82.     }
  83.  
  84.     /**
  85.      * Возвращает разницу дат
  86.      *
  87.      * @param datetime      $date1  : уменьшаемое
  88.      * @param datetime|null $date2  : вычитаемое (если не задана то текущая)
  89.      * @param string        $format : возвращаемый формат (каждому символу должен предшествовать знак процента [%])
  90.      *                              Y : Годы, число, минимум две цифры с ведущими нулями
  91.      *                              y : Годы, число
  92.      *                              M : Месяцы, число, минимум две цифры с ведущими нулями
  93.      *                              m : Месяцы, число
  94.      *                              D : Дни, число, минимум две цифры с ведущими нулями
  95.      *                              d : Дни, число
  96.      *                              a : Общее количество дней в качестве результата выполнения DateTime::diff(), либо unknown
  97.      *                              H : Часы, число, минимум две цифры с ведущими нулями
  98.      *                              h : Часы, число
  99.      *                              I : Минуты, число, минимум две цифры с ведущими нулями
  100.      *                              i : Минуты, число
  101.      *                              S : Секунды, число, минимум две цифры с ведущими нулями
  102.      *                              s : Секунды, число
  103.      *                              R : Знак "-" при отрицательном числе, "+" при положительном
  104.      *                              r : Знак "-" при отрицательном числе, пусто при положительном
  105.      *
  106.      * @return int : разность (в днях)
  107.      *
  108.      * @example:
  109.      *         echo LibDateTime::getDateDiff('01.01.2015');
  110.      *         echo LibDateTime::getDateDiff('11.11.2020', '01.01.2015');
  111.      *         echo LibDateTime::getDateDiff('11.11.2020', '01.01.2015', '%r%a');
  112.      *
  113.      * @since  21.08.2015 Gold Dragon
  114.      */
  115.     public static function getDateDiff($date1, $date2 = null, $format = '%r%a')
  116.     {
  117.         if (is_null($date2)) {
  118.             $date2 = date('Y-m-d');
  119.         }
  120.         $d2 = new DateTime($date1);
  121.         $d1 = new DateTime($date2);
  122.  
  123.         $result = (int)$d1->diff($d2)->format($format);
  124.  
  125.         return $result;
  126.     }
  127.  
  128.     /**
  129.      * Прибавляет интервал к дате
  130.      *
  131.      * @param string $date     - дата
  132.      * @param string $interval - интервал в формате ISO 8601, например, P5D (5 дней) или P3Y (3 года)
  133.      *                         Y - Количество лет
  134.      *                         M - Количество месяцев
  135.      *                         D - Количество дней
  136.      * @param string $format   - возвращаемый формат (по умолчанию  d.m.Y)
  137.      *
  138.      * @return string - дата в формате $format
  139.      *
  140.      * @example:
  141.      *         echo LibDateTime::getDateAdd('01.01.2015', 'P5D');
  142.      *         echo LibDateTime::getDateAdd('01.01.2015', 'P5D', 'Y-m-d');
  143.      */
  144.     public static function getDateAdd($date, $interval, $format = 'd.m.Y')
  145.     {
  146.         $d1 = new DateTime($date);
  147.         $result = $d1->add(new DateInterval($interval))->format($format);
  148.         return $result;
  149.     }
  150.  
  151.     /**
  152.      * Отнимает интервал от дате
  153.      *
  154.      * @param string $date     - дата
  155.      * @param string $interval - интервал в формате ISO 8601, например, P5D (5 дней) или P3Y (3 года)
  156.      *                         Y - Количество лет
  157.      *                         M - Количество месяцев
  158.      *                         D - Количество дней
  159.      * @param string $format   - возвращаемый формат (по умолчанию  d.m.Y)
  160.      *
  161.      * @return string - дата в формате $format
  162.      *
  163.      * @example:
  164.      *         echo LibDateTime::getDateSub('01.01.2015', 'P5D');
  165.      *         echo LibDateTime::getDateSub('01.01.2015', 'P5D', 'Y-m-d');
  166.      */
  167.     public static function getDateSub($date, $interval, $format = 'd.m.Y')
  168.     {
  169.         $d1 = new DateTime($date);
  170.         $result = $d1->sub(new DateInterval($interval))->format($format);
  171.         return $result;
  172.     }
  173.  
  174.     /**
  175.      * Преобразует дату в нужный формат
  176.      *
  177.      * @param string $date   - дата (если не задана то текущая)
  178.      * @param string $format - возвращаемый формат (по умолчанию  d.m.Y)
  179.      *
  180.      * @return string
  181.      *
  182.      * @example:
  183.      *         echo LibDateTime::formatDate();
  184.      *         echo LibDateTime::formatDate('', 'Y-m-d');
  185.      *         echo LibDateTime::formatDate('01.01.2015', 'Y-m-d');
  186.      */
  187.     public static function formatDate($date = null, $format = 'd.m.Y')
  188.     {
  189.         if (empty($date)) {
  190.             $date = date('d.m.Y');
  191.         }
  192.  
  193.         $date_obj = new DateTime($date);
  194.         return $date_obj->format($format);
  195.     }
  196.  
  197.     /**
  198.      * Возвращает выпадающий список дней месяца
  199.      *
  200.      * @param int      $month       : номер месяца
  201.      * @param int      $year        : год
  202.      * @param string   $tag_name    : имя тега
  203.      * @param null|int $selected    : значение для выбора
  204.      * @param string   $tag_attribs : дополнительные атрибуты тега
  205.      * @param int      $calendar    : Календарь, используемый для вычисления
  206.      *                              0 or CAL_GREGORIAN - Грегорианский календарь (по умолчанию)
  207.      *                              1 or CAL_JULIAN - Юлианский календарь
  208.      *                              2 or CAL_JEWISH - Еврейский календарь
  209.      *                              3 or CAL_FRENCH - Календарь со дня Французской революции
  210.      *
  211.      * @return string : HTML-код
  212.      *
  213.      * @example:
  214.      *         echo LibDateTime::selectDays(2, 2015, 'qqq');
  215.      *         echo LibDateTime::selectDays(2, 2015, 'qqq', 12);
  216.      *         echo LibDateTime::selectDays(2, 2015, 'qqq', '', ' id="qq1" style="color:#900"');
  217.      */
  218.     public static function selectDays($month, $year, $tag_name, $selected = null, $tag_attribs = '', $calendar = CAL_GREGORIAN)
  219.     {
  220.         $result = '';
  221.         $_day = cal_days_in_month($calendar, $month, $year);
  222.  
  223.         $result .= '<select name="' . $tag_name . ' ' . $tag_attribs . '">';
  224.  
  225.         for ($i = 1; $i <= $_day; $i++) {
  226.             $extra = ($i == $selected) ? ' selected="selected"' : '';
  227.             $result .= '<option value="' . $i . '" ' . $extra . '>' . $i . '</option>';
  228.         }
  229.  
  230.         $result .= '</select>';
  231.  
  232.         return $result;
  233.     }
  234.  
  235.     /**
  236.      * Возвращает выпадающий список месяцев
  237.      *
  238.      * @param string   $tag_name    : имя тега
  239.      * @param null|int $selected    : значение для выбора
  240.      * @param string   $tag_attribs : дополнительные атрибуты тега
  241.      * @param bool     $padez       : падеж
  242.      *                              true : именительны (по умолчанию)
  243.      *                              false : родительный
  244.      *
  245.      * @return string : HTML-код
  246.      *
  247.      * @example:
  248.      *         echo LibDateTime::selectMonth('qqq');
  249.      *         echo LibDateTime::selectMonth('qqq', 5);
  250.      *         echo LibDateTime::selectMonth('qqq', '', ' id="qq1" style="color:#900"', false);
  251.      */
  252.     public static function selectMonth($tag_name, $selected = null, $tag_attribs = '', $padez = true)
  253.     {
  254.         $result = '';
  255.         $month = ($padez) ? self::$MONTH_NAME_I : self::$MONTH_NAME_R;
  256.  
  257.         $result .= '<select name="' . $tag_name . ' ' . $tag_attribs . '">';
  258.  
  259.         for ($i = 1; $i < 13; $i++) {
  260.             $extra = ($i == $selected) ? ' selected="selected"' : '';
  261.             $result .= '<option value="' . $i . '" ' . $extra . '>' . $month[$i] . '</option>';
  262.         }
  263.  
  264.         $result .= '</select>';
  265.  
  266.         return $result;
  267.     }
  268.  
  269.     /**
  270.      * Возвращает выпадающий список годов
  271.      *
  272.      * @param int $year1 : начальный год
  273.      * @param string   $tag_name    : имя тега
  274.      * @param null|int $selected    : значение для выбора
  275.      * @param string   $tag_attribs : дополнительные атрибуты тега
  276.      * @param null|int $year2 : конечный год (если не задан, то текущий)
  277.      *
  278.      * @return string : HTML-код
  279.      *
  280.      * @example:
  281.      *         echo LibDateTime::selectYear(2000, 'qqq');
  282.      *         echo LibDateTime::selectYear(2000, 'qqq', 2013);
  283.      *         echo LibDateTime::selectYear(2000, 'qqq', '', ' id="qq1" style="color:#900"', 2020);
  284.      */
  285.     public static function selectYear($year1, $tag_name, $selected = null, $tag_attribs = '', $year2 = null)
  286.     {
  287.         $result = '';
  288.         if (empty($year2)) {
  289.             $year2 = date('Y');
  290.         }
  291.  
  292.         $result .= '<select name="' . $tag_name . ' ' . $tag_attribs . '">';
  293.  
  294.         for ($i = $year1; $i <= $year2; $i++) {
  295.             $extra = ($i == $selected) ? ' selected="selected"' : '';
  296.             $result .= '<option value="' . $i . '" ' . $extra . '>' . $i . '</option>';
  297.         }
  298.  
  299.         $result .= '</select>';
  300.  
  301.         return $result;
  302.  
  303.     }
  304. }


Код полностью документирован и с примерами. Если понравится, то буду только рад вам облегчить жизнь в написание своих проектов.

Если будут вопросы или предложения, буду только рад услышать.
2. GoDr - 21 Августа, 2015 - 16:56:42 - перейти к сообщению
Добавлен параметр возвращаемого формата в метод \LibDateTime::getDateDiff
3. DeepVarvar - 21 Августа, 2015 - 17:06:49 - перейти к сообщению
Распили на большее кол-во компонентов, ибо плюралке не надо знать про генерацию опшнов селекта. Да и вообще генерация опшнов -- это хелпер, который к датам никакого отношения не имеет и может генерировать все что угодно.

Вобщем Google картинки -> печать переделывай
4. GoDr - 21 Августа, 2015 - 19:14:22 - перейти к сообщению
DeepVarvar, ну и сленг... Понадобился гугл для перевода Радость
Последнюю фразу не понял вообще ))))

Да, согласен что HTML не сюда, но лишнее всегда можно выкинуть.

PS
Хотя по сути тоже даты Закатив глазки

PSS
А может по коду или по набору методов есть советы?
5. DeepVarvar - 21 Августа, 2015 - 19:26:10 - перейти к сообщению
GoDr пишет:
Последнюю фразу не понял вообще
Зайди в гуглопоиск по картинкам и набери фразу: печать переделывай
GoDr пишет:
но лишнее всегда можно выкинуть
Его нужно выкидывать еще при проектировании.
Ты тащиш кучу методов в память, которые могут быть не использованы вообще.
Меня вообще умиляют умники, делающие мега-фат-комбайны (вторая версия вроде уже повменяемее): https://github[dot]com/yiisoft/yii/b[dot][dot][dot]work/yiilite.php
Разделяй на большее кол-во классов, мух от котлет отделять надо.
Клади все классы в свой компонент, определись с неймспейсами и автолоадом.
Главный смысл -- подгружаться должно только то, что действительно нужно здесь и сейчас.
GoDr пишет:
по коду или по набору методов есть советы
Осознай то что я написал выше, тогда конкретные советы появятся в твоей голове сами.
6. GoDr - 21 Августа, 2015 - 19:50:43 - перейти к сообщению
Спасибо за критику! Сам понимаю про "мух и котлет". Просто пошёл по другой логике: по смыслу, а не по коду )))

Но скорее всего (уже после "нормального" и человеческого объяснения) мухи будут отдельно Улыбка. Просто пишу класс именно по выводу элементов форму, именно "хелпер" Радость Вот туда всё и кину, думаю будет разумнее.. Заодно и показу, люблю "критику" )))
(Добавление)

DeepVarvar, скорее всего ты сказал именно то что я хотел услышать и сам к этому шёл, но просто не хватило "последней капли". Ещё раз спасибо. Вроде сказал что куча проблем, но так что и не обидно и всё по делу.

 

Powered by ExBB FM 1.0 RC1