Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

Простое преобразование даты к виду `06 Октября 2012`
http://forum.kohanaframework.su/viewtopic.php?f=38&t=400
Страница 1 из 2

Автор:  AmberLEX [ 06 окт 2012, 22:34 ]
Заголовок сообщения:  Простое преобразование даты к виду `06 Октября 2012`

Решение набросал по-быстрому, чтоб не заморачиваться :)

В таблице есть поле `created` типа TIMESTAMP в виде `2012-10-06 18:58:56`
Нужно вывести дату в виде `06 Октября 2012`
Код:
/*
 * Extend the Kohana Date helper
 */
class Date extends Kohana_Date
{
    /**
     * Возвращаем название месяца на русском соответствующее номеру месяца
     *
     * @param $month  Номер месяца от 01 до 12
     *
     * @return mixed
     */
    public static function get_month_full($month)
    {
        $months = array(
            '01' => 'Января',
            '02' => 'Февраля',
            '03' => 'Марта',
            '04' => 'Апреля',
            '05' => 'Мая',
            '06' => 'Июня',
            '07' => 'Июля',
            '08' => 'Августа',
            '09' => 'Сентября',
            '10' => 'Октября',
            '11' => 'Ноября',
            '12' => 'Декабря',
        );

        return $months[$month];
    }

    /**
     * Возвращаем дату в формате: `06 Января 2012`
     * (PHP 5 >= 5.2.0)
     *
     * @param $date_string  Строка вида `2012-10-06 18:58:56`
     *
     * @return string
     */
    public static function d_m_Y($date_string)
    {
        $date = new DateTime($date_string);

        return $date->format('d') . ' ' . Date::get_month_full($date->format('m')) . ' ' . $date->format('Y');
    }
}
 

Отображаем в шаблоне так
Код:
<?php echo Date::d_m_Y($obj->created) ?>

Автор:  Sergey [ 08 окт 2012, 06:45 ]
Заголовок сообщения:  Re: Простое преобразование даты к виду `06 Октября 2012`

Код:
    public static function get_month_full($month, $sufix = NULL)
    {
        $months = array(
            '01' => 'Январ' . (! is_null($sufix) ? 'я' : 'ь'),
            '02' => 'Феврал' . (! is_null($sufix) ? 'я' : 'ь'),
            '03' => 'Март' . (! is_null($sufix) ? 'а' : ''),
            '04' => 'Апрел' . (! is_null($sufix) ? 'я' : ''),
            '05' => 'Ма' . (! is_null($sufix) ? 'я' : 'й'),
            '06' => 'Июн' . (! is_null($sufix) ? 'я' : 'ь'),
            '07' => 'Июл' . (! is_null($sufix) ? 'я' : 'ь'),
            '08' => 'Август' . (! is_null($sufix) ? 'а' : ''),
            '09' => 'Сентябр' . (! is_null($sufix) ? 'я' : 'ь'),
            '10' => 'Окябр' . (! is_null($sufix) ? 'я' : 'ь'),
            '11' => 'Ноябр' . (! is_null($sufix) ? 'я' : 'ь'),
            '12' => 'Декабр' . (! is_null($sufix) ? 'я' : 'ь'),
        );

        return $months[$month];
    }


А вообще, тут прослеживается закономерность, по этому по склонению можно написать алгоритм :ugeek:

Но лучше такие вещи кешировать:

Код:
protected $_month = NULL;

public static function get_month_full($month, $sufix = NULL)
    {
        if (is_null($this->_month))
        {
         $this->_month = array(
            '01' => 'Январ' . (! is_null($sufix) ? 'я' : 'ь'),
            '02' => 'Феврал' . (! is_null($sufix) ? 'я' : 'ь'),
            '03' => 'Март' . (! is_null($sufix) ? 'а' : ''),
            '04' => 'Апрел' . (! is_null($sufix) ? 'я' : ''),
            '05' => 'Ма' . (! is_null($sufix) ? 'я' : 'й'),
            '06' => 'Июн' . (! is_null($sufix) ? 'я' : 'ь'),
            '07' => 'Июл' . (! is_null($sufix) ? 'я' : 'ь'),
            '08' => 'Август' . (! is_null($sufix) ? 'а' : ''),
            '09' => 'Сентябр' . (! is_null($sufix) ? 'я' : 'ь'),
            '10' => 'Окябр' . (! is_null($sufix) ? 'я' : 'ь'),
            '11' => 'Ноябр' . (! is_null($sufix) ? 'я' : 'ь'),
            '12' => 'Декабр' . (! is_null($sufix) ? 'я' : 'ь'),
          );
        }
        return $this->_month[$month];
    }

Автор:  Sergey [ 08 окт 2012, 06:53 ]
Заголовок сообщения:  Re: Простое преобразование даты к виду `06 Октября 2012`

Да и я бы не хранил в таблице дату в таком странном формате.
Поле должно быть int, а заносить туда например time()

Автор:  AmberLEX [ 08 окт 2012, 10:52 ]
Заголовок сообщения:  Re: Простое преобразование даты к виду `06 Октября 2012`

Немного не точно. Не выйдет в статическом методе использовать this->
Тогда уже так (переделал и у себя)
Код:
<?php defined('SYSPATH') or die('No direct script access.');
/*
 * Extend the Kohana Date helper
 */
class Date extends Kohana_Date
{
    // Переменная для кеширования
    protected static $_month = NULL;

    /**
     * Возвращаем название месяца на русском соответствующее номеру месяца
     *
     * @param      $month  Номер месяца от 01 до 12
     * @param bool $sufix
     *
     * @return mixed
     */
    public static function get_month_full($month, $sufix = true)
    {
        if (self::$_month === null)
        {
            self::$_month = array(
                '01' => 'Январ'   . ($sufix ? 'я' : 'ь'),
                '02' => 'Феврал'  . ($sufix ? 'я' : 'ь'),
                '03' => 'Март'    . ($sufix ? 'а' : '' ),
                '04' => 'Апрел'   . ($sufix ? 'я' : '' ),
                '05' => 'Ма'      . ($sufix ? 'я' : 'й'),
                '06' => 'Июн'     . ($sufix ? 'я' : 'ь'),
                '07' => 'Июл'     . ($sufix ? 'я' : 'ь'),
                '08' => 'Август'  . ($sufix ? 'а' : '' ),
                '09' => 'Сентябр' . ($sufix ? 'я' : 'ь'),
                '10' => 'Октябр'  . ($sufix ? 'я' : 'ь'),
                '11' => 'Ноябр'   . ($sufix ? 'я' : 'ь'),
                '12' => 'Декабр'  . ($sufix ? 'я' : 'ь'),
            );
        }

        return self::$_month[$month];
    }

    /**
     * Возвращаем дату в формате: `06 Января 2012`
     * (PHP 5 >= 5.2.0)
     *
     * @param $date_string  Строка вида `YYYY-MM-DD HH:MM:SS`
     *
     * @return string
     */
    public static function d_m_Y($date_string)
    {
        $date = new DateTime($date_string);

        return $date->format('d') . ' ' . Date::get_month_full($date->format('m')) . ' ' . $date->format('Y');
    }
}
 

И я вообще обычно не использую is_null, а строгое равенство - так как-то нагляднее, да и выполняется наверное быстрее (хотя здесь роли это не играет).

С TIMESTAMP я так и не очень понял, че-то я не вижу в базе количество секунд)
— тип данных для хранения даты и времени. Данные хранятся в виде количества секунд, прошедших с начала «эпохи Юникса». Диапазон значений: 1970-01-01 00:00:00 — 2038-12-31 00:00:00. Занимает 4 байта. (http://lifeexample.ru/razrabotka-i-opti ... cript.html)

Извините, с кешированием промашка небольшая вышла, подправил файл

Автор:  Sergey [ 08 окт 2012, 16:17 ]
Заголовок сообщения:  Re: Простое преобразование даты к виду `06 Октября 2012`

посмотри возвращаемое значение ф-ции time()

Автор:  AmberLEX [ 08 окт 2012, 17:29 ]
Заголовок сообщения:  Re: Простое преобразование даты к виду `06 Октября 2012`

Ну в time() секунды, при чем здесь time?

Автор:  Sergey [ 08 окт 2012, 22:12 ]
Заголовок сообщения:  Re: Простое преобразование даты к виду `06 Октября 2012`

а при том date('формат', time()).
и при чём здесь секунды?

Автор:  AmberLEX [ 09 окт 2012, 00:47 ]
Заголовок сообщения:  Re: Простое преобразование даты к виду `06 Октября 2012`

`date_created` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`date_updated` timestamp NULL DEFAULT '0000-00-00 00:00:00',

в базе находится
'2012-06-06 03:25:57',
'2012-06-30 06:25:13'

TIMESTAMP — тип данных для хранения даты и времени. Данные хранятся в виде количества секунд, прошедших с начала «эпохи Юникса». Диапазон значений: 1970-01-01 00:00:00 — 2038-12-31 00:00:00. Занимает 4 байта.

где секунды?

echo $obj->date_created;
2012-06-06 03:25:57

SELECT unix_timestamp(YYYY-MM-DD HH:MM:SS); - тогда наверное получу секунды.
Но хранится то вроде не в виде секунд

Код:
    protected $_updated_column = array(
        'column' => 'updated',
        'format' => 'Y-m-d H:i:s'
    );
 
И так я тоже не запишу туда секунды

$obj->updated_column = time();
$obj->save();
или
$obj->updated_column = 20121349725879;
$obj->save();

Автор:  Sergey [ 09 окт 2012, 01:04 ]
Заголовок сообщения:  Re: Простое преобразование даты к виду `06 Октября 2012`

Код:
$current_date = time(); // Например вернёт 1350526943

$format_1 = 'd.m.Y';
$format_2 = 'H:i:s';
$format_3 = 'D, d M Y H:i:s';

echo date($format_1, $current_date); // 18.10.2012
echo date($format_2, $current_date); // 06:22:23
echo date($format_2, $current_date); // Thu, 18 Oct 2012 06:22:23


http://php.net/manual/ru/function.date.php

Автор:  AmberLEX [ 09 окт 2012, 08:02 ]
Заголовок сообщения:  Re: Простое преобразование даты к виду `06 Октября 2012`

Я говорю про mysql, а не php
Что делает date я прекрасно знаю

Еще раз!
TIMESTAMP — тип данных для хранения даты и времени. Данные хранятся в виде количества секунд, прошедших с начала «эпохи Юникса». Диапазон значений: 1970-01-01 00:00:00 — 2038-12-31 00:00:00. Занимает 4 байта. (http://lifeexample.ru/razrabotka-i-opti ... cript.html)

С чего он взял, что данные хранятся в виде количества секунд? Все хранится в виде бинарного файла как я понимаю.
Тут вопрос не в каком виде хранятся, а в коком виде отображаются (извлекаются)
До mysql 5 формат был таким YYYYMMDDHHMMSS
В mysql 5 формат такой: 'YYYY-MM-DD HH:MM:SS', в такй же как и DATETIME (выводятся 19 символов)
Сколько это занимает байт, думаю, зависит от разрядности.

Поэтому я с спрашивал: где секунды, если "данные хранятся в виде количества секунд"?

Т.е. чтобы сохранить дату в TIMESTAMP нужно ее привести к виду 'YYYY-MM-DD HH:MM:SS' (например функцией date)
Извлекается она тоже в таком виде.

Страница 1 из 2 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/