Функция PHP strtotime(), которая принимает формат?

strtotime() в PHP отлично работает, если вы можете предоставить ему формат даты, который он понимает и может конвертировать, но, например, вы указываете дату в Великобритании, и он не может дать правильную отметку времени unix.

Есть ли какая-либо функция PHP, официальная или неофициальная, которая может принимать переменную формата, которая сообщает функции, в каком формате передаются дата и время?

Ближе всего к этому я подошел к смеси date_parse_from_format() и mktime().

// Example usage of the function I'm after
//Like the date() function but in reverse
$timestamp = strtotimeformat("03/05/2011 16:33:00", "d/m/Y H:i:s");

person Scott    schedule 03.05.2011    source источник


Ответы (3)


Если у вас PHP 5.3:

$date = DateTime::createFromFormat('d/m/Y H:i:s', '03/05/2011 16:33:00');
echo $date->getTimestamp();
person meze    schedule 03.05.2011
comment
Я хочу вернуть временную метку unix, а не дату в другом строковом формате. - person Scott; 03.05.2011
comment
@Andrew - meze изменил свой ответ, изначально у него не было getTimestamp(); - person Scott; 03.05.2011

Я думаю, вы ищете strptime. вы можете использовать его для анализа даты, а затем использовать mktime, если вам нужна отметка времени UNIX.

function strotimeformat($date, $format) {
  $d = strptime($date, $format);
  return mktime($d['tm_hour'], $d['tm_min'], $d['tm_sec'],
                $d['tm_mon'], $d['tm_mday'], $d['tm_year']);
}

Это будет работать с PHP 5.1 и выше.

person Emil Vikström    schedule 03.05.2011
comment
нет, я ищу что-то, что возвращает временную метку unix в массив значений. Кроме того, strptime не реализован в Windows, поэтому это не идеальное решение. - person Scott; 03.05.2011
comment
Ok. Я обновил свой ответ функцией, которая все равно дает вам метку времени (хотя все еще не работает в Windows). Конечно, вы можете выполнить некоторую работу с подстрокой + strpos (или взорвать + переставить + взорвать), чтобы превратить ее в дату в США. - person Emil Vikström; 03.05.2011
comment
Как упоминалось в моем вопросе, я уже использую комбинацию date_parse_from_format() и mktime() так же, как вы показали свой код. date_parse_from_format() работает на всех системах, но работает только на PHP 5.3 ›= wereas strptime работает на более ранней версии, но не на Windows. Я оставлю вопрос открытым на несколько дней, чтобы посмотреть, появятся ли другие ответы. - person Scott; 03.05.2011
comment
Вам абсолютно необходимо иметь аргумент формата? Может быть, вы можете просто выбросить date_parse_from_format() и вместо этого использовать sscanf()? Это дало бы вам поддержку на большинстве платформ. - person Emil Vikström; 03.05.2011

strtotime предполагает, что это дата/время в США при использовании / в качестве разделителя. Чтобы заставить его думать, что это европейская дата/время, используйте - или . в качестве разделителя даты. Вы можете изменить /s на -s или .s с помощью простого str_replace()

person Phoenix    schedule 03.05.2011
comment
Прочтите вопрос... Я хорошо знаю, на что способен strtotime и как это обойти. Но это не то, о чем я прошу... Я прошу функцию, которая принимает дату в любом формате вместе со строкой, указывающей, в каком формате находится эта дата, и возвращает временную метку unix. - person Scott; 03.05.2011