Форум русской поддержки Joomla!® CMS
05.12.2016, 16:32:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2 3  Все   Вниз
  Добавить закладку  |  Печать  
Автор

Как преобразовать дату средствами PHP?

 (Прочитано 1012 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« : 28.02.2016, 02:19:17 »

Здравствуйте!

Пишу модуль для вывода отзывов с сайта http://freelancehunt.com, использую их API. В настройках модуля есть вывод даты отзыва. Хочу сделать возможность выбора формата даты.

В модуле это реализовано вот так: http://clip2net.com/s/3uT31cZ. Суть в том,  что все даты отзывов лежат в массиве.
Вопрос: как делать выборку из массива, преобразовывать в нужный формат, и перезаписывать обратно в массив?

Подскажите пожалуйста.
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #1 : 28.02.2016, 02:42:33 »

Вопросом на вопрос
А пользовательский формат в приведенном скрине, что делает?
Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #2 : 28.02.2016, 02:43:52 »

Это возможность пользователю прописать свой формат даты. По сути эти возможности из компонента Zoo (элемент date) уж очень понравилась эта возможность. Но вот как это в модуле сделать, пока не разберусь
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #3 : 28.02.2016, 02:50:57 »

если вы не будете использовать все значения массива то даты лучше преобразовывать перед выводом
в другом же случае foreach самый быстрый цикл в php
Код
foreach($arr as &$value){
   $value['date'] = 'new date';
}
Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #4 : 28.02.2016, 02:55:50 »

Наверное будет проще, если вы увидите кусок моего кода. Вот этот код отвечает за переключатель, который выводит дату:
Код:
// Вывод времени отзыва
$review_time = $params->get('review_time');
    if ($review_time == 1) {
    $rev_time_array = array();
    for ($i = 0; $i <= $reviews_count; $i++) {
        $rev_time = $json['reviews'][$i]['review_time'];
        // Добавляем в массив время отзывов
        $rev_time_array[] = $rev_time;
        // В массиве могут оказаться пустые значения, избавляемся от них
        $rev_time_array = array_diff($rev_time_array, $array_empty);
        }
    }

И вот у нас есть массив в таком формате:
Код:
Array ( [0] => 2015-05-07T16:42:14+03:00 [1] => 2014-10-31T22:22:02+02:00 )

И мне бы хотелось, чтобы у пользователя была возможность выбрать нужный формат даты. В моём примере в массиве дата выводится в полном формате.
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #5 : 28.02.2016, 03:02:29 »

Код
print_r(date_parse('2015-05-07T16:42:14+03:00'));
дальше из массива собирайте как вам нужно
или так
Код
$date = date_create('2015-05-07T16:42:14+03:00');
echo date_format($date, "Y/m/d H:i:s");
« Последнее редактирование: 28.02.2016, 03:07:05 от Fedor Vlasenko » Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #6 : 28.02.2016, 03:04:45 »

Код
print_r(date_parse('2015-05-07T16:42:14+03:00'));
дальше из массива собирайте как вам нужно

А как мне через date_parse взять элемент из массива именно?
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #7 : 28.02.2016, 03:15:38 »

Код
foreach($json['reviews'] as &$review){
   if(empty($review['review_time'])) continue;
   $review['review_time'] = date_format(date_create($review['review_time']), "Y/m/d H:i:s"); //нужный формат здесь задаем
}
 
« Последнее редактирование: 28.02.2016, 03:19:42 от Fedor Vlasenko » Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #8 : 28.02.2016, 03:21:33 »

Ага, Спасибо. И последнюю строку уже можно изменять по условию как я понимаю
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #9 : 28.02.2016, 03:33:46 »

да
Код
$format = 'Y/m/d H:i:s';
foreach($json['reviews'] as &$review){
   if(empty($review['review_time'])) continue;
   $review['review_time'] = date_format(date_create($review['review_time']), $format);
}
Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #10 : 28.02.2016, 16:03:03 »

Нет, наверное всё-таки немного не так.
Дело в том,  что у меня уже есть чистый массив $rev_time_array и мне надо из него брать дату, преобразовывать в нужном формате, и перезаписывать элемент массива
Записан
buyanov
Осваиваюсь на форуме
***

Репутация: +22/-0
Offline Offline

Пол: Мужской
Сообщений: 150


Сайты 74


« Ответ #11 : 28.02.2016, 21:59:11 »

Привет, а даты приходят в таком формате из API?
Почему бы не использовать для всего этого колдовства с датами стандартные возможности Joomla например класс JDateTime и JText?
Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #12 : 28.02.2016, 22:03:46 »

Привет, а даты приходят в таком формате из API?
Почему бы не использовать для всего этого колдовства с датами стандартные возможности Joomla например класс JDateTime и JText?

Привет. Да, вот я в сообщении указал, в каком виде у меня массив с датами получается. Спасибо, почитаю про JDateTime. В PHP пока что начинающий, поэтому не всё ещё понимаю)
Записан
buyanov
Осваиваюсь на форуме
***

Репутация: +22/-0
Offline Offline

Пол: Мужской
Сообщений: 150


Сайты 74


« Ответ #13 : 28.02.2016, 22:22:31 »

Попробуйте так

JHtml::date(JFactory::getDate('2015-05-07T16:42:14+03:00'), JText::_('DATE_FORMAT_LC1'));

Форматы в русской локализации Joomla

DATE_FORMAT_LC="d.m.Y"
DATE_FORMAT_LC1="d.m.Y"
DATE_FORMAT_LC2="d.m.Y H:i"
DATE_FORMAT_LC3="d F Y"
DATE_FORMAT_LC4="d.m.Y"
DATE_FORMAT_JS1="d.m.y"

UPD а если хочется давать возможность пользователю задавать свой формат, то дату лучше хранить в юнкс формате
Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #14 : 28.02.2016, 22:26:35 »

Вот в этой строке JHtml::date(JFactory::getDate('2015-05-07T16:42:14+03:00') мне нужно получается выбирать именно элемент массива.

Получается надо как-то так: JHtml::date(JFactory::getDate('$rev_time_array[$i]')?
Записан
buyanov
Осваиваюсь на форуме
***

Репутация: +22/-0
Offline Offline

Пол: Мужской
Сообщений: 150


Сайты 74


« Ответ #15 : 28.02.2016, 22:41:58 »

Да JFactory::getDate первым аргументом принимает дату для преобразования, да и вообще много чего можно туда скормить даже например такое 'now +1 day' =)
Записан
robert
Профи
********

Репутация: +343/-11
Offline Offline

Пол: Мужской
Сообщений: 3581


« Ответ #16 : 28.02.2016, 22:43:17 »

А почему это
Код
print_r(date_parse('2015-05-07T16:42:14+03:00'));
дальше из массива собирайте как вам нужно
или так
Код
$date = date_create('2015-05-07T16:42:14+03:00');
echo date_format($date, "Y/m/d H:i:s");
вас не устраивает?
Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #17 : 28.02.2016, 22:52:37 »

А почему этовас не устраивает?

Подскажите как это правильно применить к массиву?
Записан
buyanov
Осваиваюсь на форуме
***

Репутация: +22/-0
Offline Offline

Пол: Мужской
Сообщений: 150


Сайты 74


« Ответ #18 : 28.02.2016, 22:54:46 »

echo date_format(date_create('2015-05-07T16:42:14+03:00'), "d.m.Y H:i");
echo date_format(date_create('2015-05-07T16:42:14'), "d.m.Y H:i");

Вернут одно и тоже!
Записан
robert
Профи
********

Репутация: +343/-11
Offline Offline

Пол: Мужской
Сообщений: 3581


« Ответ #19 : 28.02.2016, 22:56:08 »

Подскажите как это правильно применить к массиву?
А вы хоть делали
Код
print_r(date_parse('2015-05-07T16:42:14+03:00'));
?
Записан
buyanov
Осваиваюсь на форуме
***

Репутация: +22/-0
Offline Offline

Пол: Мужской
Сообщений: 150


Сайты 74


« Ответ #20 : 28.02.2016, 23:12:46 »

Код
$user_format = 'd.m.Y H:i';
$date_arr = $params->get('date_arr', array());
if (!empty($date_arr))
{
foreach($date_arr as &$date)
{
$date = (string) JFactory::getDate($date)->format($user_format);
}
}
$params->set('date_arr', $date_arr);
 

Сразу обращу внимание что Joomla преобразует время в этой дате к гринвичу, чтобы учесть еще и время которое указано в настройках нужно ей сказать об этом добавив аргумент команде format

Код
$date = (string) JFactory::getDate($date)->format($user_format, true);
 
« Последнее редактирование: 28.02.2016, 23:16:14 от buyanov » Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #21 : 28.02.2016, 23:21:31 »

А вы хоть делали
Код
print_r(date_parse('2015-05-07T16:42:14+03:00'));
?

Пробовал, выводит такой массив:
Код:
Array ( [year] => 2015 [month] => 5 [day] => 7 [hour] => 16 [minute] => 42 [second] => 14 [fraction] => 0 [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => 1 [zone_type] => 1 [zone] => -180 [is_dst] => )

Я читал об этой функции. НО! Ведь мне нужно сделать так, чтобы у меня в этой строке подставлялось содержимое элемента массива. Как это сделать? И как потом собрать дату так, как мне необходимо?
Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #22 : 28.02.2016, 23:30:09 »

Код
$user_format = 'd.m.Y H:i';
$date_arr = $params->get('date_arr', array());
if (!empty($date_arr))
{
foreach($date_arr as &$date)
{
$date = (string) JFactory::getDate($date)->format($user_format);
}
}
$params->set('date_arr', $date_arr);
 

Сразу обращу внимание что Joomla преобразует время в этой дате к гринвичу, чтобы учесть еще и время которое указано в настройках нужно ей сказать об этом добавив аргумент команде format

Код
$date = (string) JFactory::getDate($date)->format($user_format, true);
 

А можно попросить немного прокомментировать код? А то не работал с объектом этим ни разу.
Записан
buyanov
Осваиваюсь на форуме
***

Репутация: +22/-0
Offline Offline

Пол: Мужской
Сообщений: 150


Сайты 74


« Ответ #23 : 28.02.2016, 23:43:41 »

Код
// Это я чисто для примера взял формат типа от пользователя строчка
$user_format = 'd.m.Y H:i';
// $params это наверно объект класса \Joomla\Registry\Registry
// если это так то вытаскиваю параметры из моей выдуманной переменной date_arr (какая у тебя я не знаю)
// но предполагаю там найти массив, а если не нахожу то передаю значение по умолчанию array() можно 0
// передать что хочешь лишь бы проверить
$date_arr = $params->get('date_arr', array());
// проверяю есть ли в массиве данные
if (!empty($date_arr))
{
// из массива извлекаю элементы
// & - амперсанд - значит что я хочу чтобы PHP передавал значение по ссылке
// читаем тут http://php.net/manual/ru/language.references.pass.php
foreach($date_arr as &$date)
{
// JFactory - это фабрика объектов в Joomla она нам и вернет объект для преобразования даты
// format это метод объекта для преобразования даты
$date = (string) JFactory::getDate($date)->format($user_format);
}
}
// Преобразованный массив вернем на место
$params->set('date_arr', $date_arr);
 
Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #24 : 28.02.2016, 23:44:57 »

Благодарю за комментарии, буду разбираться сейчас
Записан
robert
Профи
********

Репутация: +343/-11
Offline Offline

Пол: Мужской
Сообщений: 3581


« Ответ #25 : 28.02.2016, 23:49:25 »

Я читал об этой функции.
Тогда сомневаюсь, что вы понимаете, для чего она нужна.
Код
$date=date_parse('2015-05-07T16:42:14+03:00');
echo 'Год: '.$date['year'].'<br/>';
echo 'Месяц: '.$date['month'].'<br/>';
echo 'День: '.$date['day'].'<br/>';
 
Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #26 : 29.02.2016, 00:04:33 »

Функция раскладывает дату на составляющие так сказать. И потом уже из них составляешь дату в том формате, в котором надо.
Это я понимаю.
Я не понимаю как мне использовать эту функцию таким образом, чтобы дата бралась из определённого элемента моего массива, то есть чтобы в этой строке я указал как-то так:
Код:
$date=date_parse('$rev_time_array[$i]');
так можно сделать? Функция поймёт такую запись? Или это неверно?
Записан
robert
Профи
********

Репутация: +343/-11
Offline Offline

Пол: Мужской
Сообщений: 3581


« Ответ #27 : 29.02.2016, 00:08:07 »

Код
$date=date_parse($rev_time_array[$i]);
так можно сделать? Функция поймёт такую запись? Или это неверно?
Я бы на вашем месте уже 100 раз сам пробовал и делал выводы.
Записан
zeus07
Завсегдатай
*****

Репутация: +8/-0
Offline Offline

Пол: Мужской
Сообщений: 644



« Ответ #28 : 29.02.2016, 00:13:09 »

Код
$date=date_parse($rev_time_array[$i]);
Я бы на вашем месте уже 100 раз сам пробовал и делал выводы.


Такая запись не работает, массив выводится пустой.
Записан
robert
Профи
********

Репутация: +343/-11
Offline Offline

Пол: Мужской
Сообщений: 3581


« Ответ #29 : 29.02.2016, 00:16:38 »

Значит, $rev_time_array[$i] у вас пустая или в неправильном формате. Сами ищите, где делали ошибку, модуль ваш или наш?
Записан
Страниц: [1] 2 3  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet