Автор Тема: Реформат даты  (Прочитано 3157 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AntiChrist

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.all.biz.ua
Реформат даты
« : 21 Февраля 2007, 01:29:54 »
Привет всем.
Хотелось бы функцию реформатирования дат из одного формата в другой:
(string) reformat_date($date(string),$new_format(string), $old_format(string)=\'Y-m-d H:i:s\')

Уверен, что кто то это уже делал и скорее всего лучше чем сделаю я. Наверное быстрее всего будет с регулярными выражениями. Если все таки придется делать самому подскажите плиз как разбить текущую дату на части по формат-строке old_format? (Как собрать в новую уж понятно)
----
Вся Украина - Бизнес портал

Оффлайн andymc

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 400
  • +1/-0
  • 0
    • Просмотр профиля
Реформат даты
« Ответ #1 : 21 Февраля 2007, 04:04:56 »
Если дата в формате \'02/21/2007 3:57:50\', то ...
function reformat_date($date, $new_format) {
  $tms = strtotime($date);
  return date($new_format, $tms);  
}
Если формат даты какой-то другой, то разбирать его надо отдельно примерно так
$t = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year, $month, $day, $hours, $mins, $sex);

Оффлайн AntiChrist

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.all.biz.ua
Реформат даты
« Ответ #2 : 21 Февраля 2007, 19:20:02 »
Цитировать
andymc:
Если дата в формате \'02/21/2007 3:57:50\', то ...
function reformat_date($date, $new_format) {
  $tms = strtotime($date);
  return date($new_format, $tms);  
}


На данный момент так и делаю, но есть проблема - strtotime($date) не понимает дат через точку.
В том то и задача - есть функция date которая может отформатировать дату любым удобным образом, мне нужна обратная функция которая может из строки собрать timestamp по строке форматирования.
Т.е. функция должна взять из строки форматирования формат года и найти по нему год в строковом представлении даты аналогично месяц и день и преобразовать это все в новую строку с датой в другом формате.

например мне надо:

$new_date
=reformat_date($_POST[\'date\'],\'d.m.Yг.\',$_POST[\'format\']);

Неужели никому не приходилось сталкиваться?
----
Вся Украина - Бизнес портал

Оффлайн andymc

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 400
  • +1/-0
  • 0
    • Просмотр профиля
Реформат даты
« Ответ #3 : 21 Февраля 2007, 23:51:42 »
Немного подумал...
$date    = \'16.05.2000 16:37\';
$format0 = \'d.m.Y G:i\';


// формат по установленному формату +
function reformat_static($date) {
  list($day, $month, $year) = sscanf($date, \'%d.%d.%dг.\');
  return strtotime("$month/$day/$year");
}
//echo $time = reformat_static($date);

// более сложный вариант
// если в шаблоне $format0 использовать только буквы из $matrix, то всё ок
function reformat_date($date, $format0) {
  $matrix = array(
    \'d\' => \'%d\',
    \'m\' => \'%d\',
    \'Y\' => \'%d\',
    \'G\' => \'%d\',
    \'i\' => \'%d\'
    );
  // сначала мы сохраняем все символы шаблона в порядке их появления
  $var_order = array();
  for ($i = 0; $i < strlen($format0); $i++) {
    $symb = $format0[$i];
    if (array_key_exists($symb, $matrix)) {
      $var_order[] = $symb;
    }
  }
  // создаём регулярное выражение
  $regexp = $format0;
  foreach ($matrix as $symb => $reg) {
    $regexp = str_replace($symb, $reg, $regexp);
  }
  // сканируем дату по порядку 0, 1, 2...
  $array = sscanf($date, $regexp);
  
  // теперь присваиваем переменным из $var_order значения из $array
  foreach ($var_order as $k => $var) {
    $$var = $array[$k]; // теперь в глобальной области определены переменные $d, $Y ...
  }
  // чтобы определить дату, нам нужны именно такие переменные. Но их может не быть. Это надо отдельно проверять.
  // например, empty($i) ? $i = \'\' : $i = ":$i" ; с изменением кода ниже конечно
  // это я делать уже не стал, сами поработайте
  return strtotime("$m/$d/$Y $G:$i"); // проблема в том, найдены ли данные переменные
}

echo $time = reformat_date($date, $format0);
echo \'
\' . date($format0, $time)

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28