Почему метка времени unix должна начинаться с префикса '@', чтобы strtotime () понимала это? - PullRequest
5 голосов
/ 03 марта 2012

Я заметил, что strtotime() обрабатывает метки времени Unix странным образом, и мне было любопытно, если кто-нибудь знает, почему это так:

var_export(strtotime('1330725042'));  // false
var_export(strtotime('@1330725042')); // 1330725042

Почему strtotime() возвращает false при получении unixвременная метка (если только указанная временная метка не префиксирована @)?

Это изнутри встроенного мной метода библиотеки, который предназначен для «преобразования» переменной неизвестного формата в метку времени.Использование голого strtotime() в этом случае бесполезно, потому что оно возвращает неправильный результат, когда входящее значение фактически является меткой времени.

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

Ответы [ 8 ]

5 голосов
/ 03 марта 2012

Строка, которую получает strtotime(), должна быть в определенном формате.http://www.php.net/manual/en/datetime.formats.php

Если strtotime() не распознает формат ввода, возвращается FALSE.Поскольку время Unix - это просто последовательность чисел, оно не может правильно их проанализировать, если вы не укажете явно, какой формат вы используете.Помещение @ в начале дает функции инструкцию, что эта последовательность в формате времени Unix.

Для получения дополнительной информации, вот документация: http://php.net/manual/en/function.strtotime.php

2 голосов
/ 03 марта 2012

Возможно, потому что strtotime преобразует в метку времени UNIX, поэтому она не ожидает ее в качестве параметра.

Чтение больше

1 голос
/ 03 марта 2012

strtotime () выводит метку времени, а ее параметр должен быть представлен в текстовом представлении даты, поэтому вы используете его неправильно.

1 голос
/ 03 марта 2012

Поскольку strtotime означает строка во время , а ваш «1330725042» - это не строка времени, а метка времени Unix, заключенная в кавычки.

strtotime () предназначен для использования в таких значениях, как «2 марта 2012 года».

Если у вас уже есть 1330725042 в качестве значения метки времени Unix, тогда зачем вам нужно использовать strtotime ()?

0 голосов
/ 03 марта 2012

Ответ заключается в том, что ведущий @ обозначает формат даты с меткой времени Unix, тогда как само по себе целое число является недопустимым форматом даты.см .: http://php.net/manual/en/datetime.formats.compound.php

Почему strtotime('@1 a') дает ошибочный результат -3599, однако я понятия не имею.лол

0 голосов
/ 03 марта 2012

strtotime() предназначен для преобразования английского формата даты в метку времени Unix, поэтому предоставление метки времени Unix вместо формата даты не будет допустимым использованием этой функции. Принятые форматы даты и времени можно увидеть в руководстве по php http://php.net/manual/en/datetime.formats.php

0 голосов
/ 03 марта 2012

Все остальные правы в использовании функции и в том, что она принимает строку, а не строку метки времени.Однако, если вы получаете результаты, используя знак @, то, скорее всего, оператор указывает, что следующий текст является временной меткой ИЛИ что функция обходит ошибки в соответствии со стандартным использованием PHP @.

В любом случае, почемуВы хотите, чтобы strtotime отметка времени?

0 голосов
/ 03 марта 2012

strtotime не распознает временные метки Unix, но простые английские даты или относительное время (например, «+1 день» или «1 месяц»)

@ перед значением обязательно вызовет режим php "игнорировать ошибку" в вызове (интересный побочный эффект), что позволит вернуть непарсируемое значение в дамп var.

...