nepster-web
@nepster-web

Как привести дату к нужному формату ?

К примеру есть дата вида:
2014-10-06 14:01:25

Я бы хотел привести ее к виду:
6 октября 2014 года, 14:81

Я не хочу использовать дату как строку, резать ее делать проверку на месяцы, в общем это не то что нам нужно. Я бы хотел привести дату к желаемому формату средствами php.

Откопал библиотеку Intl и попробовал что-то начудить:

$dt = new DateTime('NOW');
$formatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::FULL, IntlDateFormatter::FULL);
$formatter->setPattern('Y-m-d H:i:s');

echo $formatter->format($dt);


Получил на экран, примерно следующее:
2014-4-6 14::

Примерно я почти не нашел да и русских доков по теме тоже. Подскажите пожалуйста как привести 2014-10-06 14:01:25 к 6 октября 2014 года, 14:81 средствами php ? И ткните носом если есть хорошие рашин доки.
  • Вопрос задан
  • 3473 просмотра
Решения вопроса 2
$dateTime = DateTime::createFromFormat('Y-m-d H:i:s','2014-10-06 14:01:25');
$formatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::FULL, IntlDateFormatter::FULL);
$formatter->setPattern('d MMMM Y, k:mm:ss');
echo $formatter->format($dateTime);
Ответ написан
Комментировать
nepster-web
@nepster-web Автор вопроса
$date = new DateTime('NOW');
$formatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::FULL, IntlDateFormatter::FULL);
$formatter->setPattern ('d MMMM Y, k:mm:ss');

echo $formatter->format ($date);


Таблица символов для setPattern:
userguide.icu-project.org/formatparse/datetime

Подумайте еще раз, прежде чем хранить массивы с месяцами для разных языков и пользоваться какими-то библиотеками, в PHP все это уже есть.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Ужасный код найденный в сети
function rdate($format, $timestamp = null, $case = 0)
{
 if ( $timestamp === null )
  $timestamp = time();

 static $loc =
  'Январ,ь,я,е,ю,ём,е
  Феврал,ь,я,е,ю,ём,е
  Март, ,а,е,у,ом,е
  Апрел,ь,я,е,ю,ем,е
  Ма,й,я,е,ю,ем,е
  Июн,ь,я,е,ю,ем,е
  Июл,ь,я,е,ю,ем,е
  Август, ,а,е,у,ом,е
  Сентябр,ь,я,е,ю,ём,е
  Октябр,ь,я,е,ю,ём,е
  Ноябр,ь,я,е,ю,ём,е
  Декабр,ь,я,е,ю,ём,е';

 if ( is_string($loc) )
 {
  $months = array_map('trim', explode("\n", $loc));
  $loc = array();
  foreach($months as $monthLocale)
  {
   $cases = explode(',', $monthLocale);
   $base = array_shift($cases);
   
   $cases = array_map('trim', $cases);
   
   $loc[] = array(
    'base' => $base,
    'cases' => $cases,
   );
  }
 }
 
 $m = (int)date('n', $timestamp)-1;
 
 $F = $loc[$m]['base'].$loc[$m]['cases'][$case];

 $format = strtr($format, array(
  'F' => $F,
  'M' => substr($F, 0, 3),
 ));
 
 return date($format, $timestamp);
}

$t = strtotime("2014-10-06 14:01:25");
echo rdate("j F Y года, H:i",$t,1);
Ответ написан
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
Дело в том, что в PHP нет русских названий месяцев. Так что формировать всё равно придётся руками. А вот для разрезания есть getdate. Что-то вроде такого:
$month=[1=>'января', ..., 12=>'декабря'];
$test_date='2014-10-06 14:01:25';
$tmp=getdate(strtotime($test_date));
$result=sprintf('%02d %s %4d года, %02d:%02d',
                $tmp['mday'], $month[$tmp['mon']], $tmp['year'], $tmp['hours'], $tmp['minutes']);

Другой вариант основан на том, чтобы генерировать месяц в любом виде, а дальше регуляркой его менять. Что-то вроде:
$result=preg_replace_callback('#<(\d+)>#', function($data){
  static $month=[1=>'января', ..., 12=>'декабря'];
  return $month[$data[1]];
}, date('d <m> Y года, H:i', strtotime($test_date)));
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы