В общем слегка расширил хелпер Date, дополнив его константой ZERO и 2-мя полезными методами:Код:
<?php defined('SYSPATH') or die('No direct script access.');
/**
* Kohana Date Class Helper
*
* @package Sskin
* @category Helpers
* @author Sergey Yakovlev
* @copyright (c) 2012 Anterra Group
*/
class Date extends Kohana_Date {
const ZERO = 0;
/**
* New timestamp format for formatted_time
* Example: D, d M Y H:i:s
*
* @var string
*/
protected static $_new_format = NULL;
/**
* Tries to read the date format settings from the configuration file.
* Returns a date/time string with the specified timestamp format
* $time = Date::get_timestam_format();
*
* @link http://www.php.net/manual/datetime.construct Returns new DateTime object
* @param string $config Configuration file
* @param string $key The key in the configuration file that contains the date format
* @uses Config Loads config form file
* @return string Datetime format
*/
public static function get_timestamp_format($config = 'site', $key = 'date_format')
{
if (is_null(self::$_new_format))
{
if (! Kohana::find_file('config', $config))
{
throw new Kohana_Exception('Configuration file not exists');
}
$app_config = Kohana::$config->load($config);
self::$_new_format = ($app_config[$key]) ? $app_config[$key]: parent::$timestamp_format;
}
return self::$_new_format;
}
/**
* Returns a datetime string with the specified timestamp format
*
* $time = Date::formatted_datetime(time());
*
* @link http://www.php.net/manual/datetime.construct
* @param string $datetime_str datetime string
* @param string $timestamp_format timestamp format
* @return string Formated datetime
*/
public static function formatted_datetime($datetime_str = NULL, $timestamp_format = NULL)
{
$datetime_str = (is_null($datetime_str)) ? time() : $datetime_str;
$timestamp_format = (is_null($timestamp_format)) ? self::get_timestamp_format() : $timestamp_format;
return date($timestamp_format, $datetime_str);
}
} // End Date
Хелпер должен лежать в по адресу application/classes.
По порядку:
ZERO - я использую эту константу для удобства и читаемости в конфигурационных файлах. Например:
Код:
<?php defined('SYSPATH') or die('No direct script access.');
return array (
'cookie_lifetime' => Date::WEEK,
'session_lifetime' => Date::ZERO,
'native_lifetime' => Date::HOUR,
);
Хотя это больше эстетическое улучшение, чем практическое.
get_timestamp_format - статичный метод для формирования формата даты. читает формат с конфигурационного файла $config и ключа $key. Например такой конфиг:
Код:
<?php defined('SYSPATH') or die('No direct script access.');
return array
(
'cookie_lifetime' => Date::WEEK,
'session_lifetime' => Date::ZERO,
'native_lifetime' => Date::HOUR,
'date_format' => 'Y.m.d',
);
В данном случае в
$_new_format попадёт '
Y.m.d'. Если в конфиге '
date_format' пустой или не существует, тогда в
$_new_format попадёт значение из родительского поля
$timestamp_format. Если файл конфигов не найден - выскочит исключение. Обратите внимание на указанные мною значения по умолчанию
formatted_datetime - возвращает дату и/или время в отформатированном виде. Например вам нужно указать дату создания заказа в магазине, и есть некая переменная
$order (инстанс
ORM::factory('order')):
Код:
<?php echo Date::formatted_datetime($order->created) ?>
Все данные кешируются. С файла конфигов прочтётся один раз и далее будет использоваться статическое поле.
Вот и всё
P.S. Ах, да, забыл совсем
Имея такой хелпер, можно не заморачиваться с хранением дат в MySQL. И не нагружать вашу СУБД лишними телодвижениями.
Поле
$order->created должно быть int и записи там должны быть типа
1350005555. Записать дату в таком формате можно так
time(). Да что я вам говорю, подробнее здесь:
http://www.php.net/manual/ru/function.time.php