PHP-версия mysql's str_to_date () - PullRequest
0 голосов
/ 23 марта 2011

Я сталкивался с этим в коде моей компании, и я хотел бы изменить его на что-то, что не связано с MySQL только для функции:

$sql = "select date_format(str_to_date('$date','$format'),'%Y-%m-%d') startDate ";
$result = mysql_query($sql);
...

Наша производственная средаЯ имею в виду Unix, как и моя среда разработки, но некоторые люди пишут код в среде Windows, поэтому strptime() не вариант.

Я видел похожие вопросы, плавающие вокруг SO, но ни одинс ответом, который соответствует моим потребностям.Существует ли простой или распространенный способ извлечения дат из строк с использованием переменного формата?

Причина, по которой форматы даты могут сильно различаться, заключается в том, что мы анализируем имена файлов у поставщиков, поэтому мы должны иметь возможностьдля обработки ггггммдд, ддмггг, ддммггг, ддмониййй и т. д. и т. д.

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Короткий ответ: нет способа автоматически проанализировать произвольные форматы дат, которые будут правильно анализировать все форматы.В ваших собственных примерах форматов просто нет возможности узнать, какие числа для каких приращений даты.

Вы можете посмотреть на принятые форматы strtotime () , и если все ваши поставщики используютформаты признаны им, значит, вам повезло.Но если нет, лучшее, что вы действительно можете сделать, это создать таблицу поиска "vendor" => "format", а затем вы можете использовать date_parse_from_format ()

edit: * на основениже приведен комментарий, это php4-версия аппроксимации date_parse_from_format (), которая должна соответствовать вашим потребностям *

function date_parse_from_format($format, $date) {
  $dMask = array('H'=>'hour','i'=>'minute','s'=>'second','y'=>'year','m'=>'month','d'=>'day');
  $format = preg_split('//', $format, -1, PREG_SPLIT_NO_EMPTY);  
  $date = preg_split('//', $date, -1, PREG_SPLIT_NO_EMPTY);  
  foreach ($date as $k => $v) {
    if ($dMask[$format[$k]]) $dt[$dMask[$format[$k]]] .= $v;
  }
  return $dt;
}

По сути, вам нужна таблица поиска vendor => format, где format - маска того, что каждыйсимвол в строке даты представляет.

ПРИМЕЧАНИЕ: Маски, используемые для каждого приращения даты / времени, НЕ точно отражают то, что используется в обычном строковом формате php date () .Он упрощен и предназначен для маскировки каждого отдельного символа вашей пользовательской строки.

Пример:

/*
  lookup table for vendors
  for EVERY character you want to count as a date/time 
  increment you must use the following masks:
  hour   : H
  minute : i
  second : s
  year   : y
  month  : m
  day    : d
*/
$vendorDateFormats = array(
  'vendor1' => 'yyyymmdd',
  'vendor2' => 'mmddyyyy',
  'vendor3' => 'ddmmyyyy',
  'vendor4' => 'yyyy.mm.dd HH:ii:ss'
);

// example 1:
echo "<pre>";
print_r(date_parse_from_format($vendorDateFormats['vendor2'],'03232011'));

// example 2:
echo "<pre>";
print_r(date_parse_from_format($vendorDateFormats['vendor4'],'2011.03.23 12:03:00'));

вывод:

Array
(
    [month] => 03
    [day] => 23
    [year] => 2011
)

Array
(
    [year] => 2011
    [month] => 03
    [day] => 23
    [hour] => 12
    [minute] => 03
    [second] => 00
)
1 голос
/ 23 марта 2011

Существует функция PHP strtotime() PHP Ref , которая преобразует большинство строк, представляющих собой время (включая такие вещи, как «следующий четверг»), в метки времени, но даже при работе с и американские структуры дат («дд / мм / гггг» против «мм / дд / гггг»).

Вы можете проверить его (без написания тестового скрипта) по адресу http://www.functions -online.com / strtotime.html

...