#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.