PHP Преобразование миллисекунд в дату не выполняется в течение определенной миллисекунды (1425318722000)

Поэтому я пытаюсь преобразовать миллисекунды в дату в PHP, и я подумал, что мой скрипт работал нормально, но получал странное поведение для определенного значения в миллисекундах (1425318722000).

Я проверил это на нескольких сайтах, и все вернулись с верным значением …

Понедельник, 2 марта 2015 г., 17:52:02 по Гринвичу

Пн Март 2015 2015 17:52:02

Пн Март 2015 2015 17:52:02 GMT + 0000 (GMT)

Понедельник, 02 марта 2015 17:52:02 GMT

Любая идея, почему это происходит, возможно, это ошибка PHP?

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318721999/1000));"object(DateTime)#1 (3) {
["date"]=>
string(19) "2015-03-02 17:52:01"["timezone_type"]=>
int(1)
["timezone"]=>
string(6) "+00:00"}

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318722000/1000));"bool(false)

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318722001/1000));"object(DateTime)#1 (3) {
["date"]=>
string(19) "2015-03-02 17:52:02"["timezone_type"]=>
int(1)
["timezone"]=>
string(6) "+00:00"}

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318722002/1000));"object(DateTime)#1 (3) {
["date"]=>
string(19) "2015-03-02 17:52:02"["timezone_type"]=>
int(1)
["timezone"]=>
string(6) "+00:00"}

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318722003/1000));"object(DateTime)#1 (3) {
["date"]=>
string(19) "2015-03-02 17:52:02"["timezone_type"]=>
int(1)
["timezone"]=>
string(6) "+00:00"}

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318722004/1000));"object(DateTime)#1 (3) {
["date"]=>
string(19) "2015-03-02 17:52:02"["timezone_type"]=>
int(1)
["timezone"]=>
string(6) "+00:00"}

php -r "var_dump(DateTime::createFromFormat('U.u', 1425318722005/1000));"object(DateTime)#1 (3) {
["date"]=>
string(19) "2015-03-02 17:52:02"["timezone_type"]=>
int(1)
["timezone"]=>
string(6) "+00:00"}

1

Решение

Это тот факт, что вы используете 'U.u' маска, но .u теряется из значения, когда все результаты равны 0 после десятичного числа для этого деления

for($ms = 1425318721999; $ms <= 1425318722001; ++$ms) {
var_dump(DateTime::createFromFormat('U.u', sprintf('%14.3f', $ms/1000)));
}

Будет работать, потому что вы используете sprintf () для сохранения этих нулей после десятичной точки

for($ms = 1425318721999; $ms <= 1425318722001; ++$ms) {
var_dump(DateTime::createFromFormat('U', floor($ms/1000)));
}

также будет работать, но вы потеряете точность в миллисекундах

Для некоторого объяснения:

public static DateTime DateTime::createFromFormat ( string $format , string $time [, DateTimeZone $timezone ] )

createFromFormat() ожидает строку в качестве второго аргумента, поэтому PHP свободно преобразует результат вашего деления в строку и значение с плавающей запятой, например 1425318722.000 будет приведен к строке "1425318722" без десятичной точки или следующих нулей, поэтому он не соответствует U.u маска, которая требует десятичной точки и следующих цифр

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]