Forum Webscript.Ru

Программирование => PHP => Тема начата: AntiChrist от 21 Февраля 2007, 01:29:54

Название: Реформат даты
Отправлено: AntiChrist от 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 от 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 от 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 от 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)