Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 05 окт 2024, 03:16

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 06 окт 2012, 22:34 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Решение набросал по-быстрому, чтоб не заморачиваться :)

В таблице есть поле `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) ?>

_________________
http://de-en.info (работает на Kohana 3.3)


Последний раз редактировалось AmberLEX 23 окт 2012, 22:58, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 окт 2012, 06:45 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Код:
    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];
    }


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 окт 2012, 06:53 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Да и я бы не хранил в таблице дату в таком странном формате.
Поле должно быть int, а заносить туда например time()


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 окт 2012, 10:52 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Немного не точно. Не выйдет в статическом методе использовать 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)

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

_________________
http://de-en.info (работает на Kohana 3.3)


Последний раз редактировалось AmberLEX 23 окт 2012, 22:58, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 окт 2012, 16:17 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
посмотри возвращаемое значение ф-ции time()


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 окт 2012, 17:29 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Ну в time() секунды, при чем здесь time?

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 окт 2012, 22:12 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
а при том date('формат', time()).
и при чём здесь секунды?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 окт 2012, 00:47 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
`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();

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 окт 2012, 01:04 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Код:
$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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 окт 2012, 08:02 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Я говорю про 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)
Извлекается она тоже в таком виде.

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group