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

#php #datetime #strtotime #mktime

#php #datetime #strtotime #mktime

Вопрос:

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");
  

Ответ №1:

Если у вас PHP 5.3:

 $date = DateTime::createFromFormat('d/m/Y H:i:s', '03/05/2011 16:33:00');
echo $date->getTimestamp();
  

Комментарии:

1. Я хочу вернуть временную метку unix, а не дату в другом строковом формате.

2. @Andrew — meze изменил свой ответ, в нем изначально не было getTimestamp();

Ответ №2:

Я думаю, вы ищете 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 и более поздними версиями.

Комментарии:

1. нет, это не так, я ищу что-то, что возвращает временную метку unix в массив значений. Плюс strptime не реализован в Windows, так что это не идеальное решение.

2. ОК. Я обновил свой ответ функцией, которая в любом случае предоставит вам временную метку (хотя в Windows она все еще не работает). Вы, конечно, можете выполнить некоторую работу с подстрокой strpos (или разнести переставить имплод), чтобы преобразовать ее в американскую дату.

3. Как упоминалось в моем вопросе, я уже использую комбинацию date_parse_from_format() и mktime() таким же образом, как вы показали свой код. date_parse_from_format() работает для всех систем, но работает только на PHP 5.3 >= поскольку strptime работает на более ранней версии, но не на Windows. Я оставлю вопрос открытым на несколько дней, чтобы посмотреть, поступят ли какие-либо другие ответы.

4. Вам обязательно нужен аргумент format? Может быть, вы можете просто выбросить date_parse_from_format() и использовать sscanf() вместо этого? Это обеспечило бы вам поддержку на большинстве платформ.

Ответ №3:

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

Комментарии:

1. Прочитайте вопрос… Я вполне осведомлен о том, на что способен strtotime и как его обойти. Но это не то, о чем я спрашиваю… Я запрашиваю функцию, которая принимает дату в любом формате вместе со строкой, указывающей, в каком формате находится эта дата, и возвращает временную метку unix.