почему strotime возвращает отрицательное значение в php?

Я использую strtotime для преобразования даты в отметку unixtime. Год, дата и день представляют собой разные значения для кода, и я использую приведенный ниже код для создания метки времени.

$year  = '1961';
$month = '2';
$day   = '15';

$date  = $year."-".$month."-".$day;

echo strtotime($date);

Приведенный выше код печатает: -27648000 для меня. Если год выше 1970, он выводит положительные результаты. Я все еще учусь с отметкой времени, если кто-нибудь может мне помочь. Основная цель - преобразовать дату в временную метку unix.

Вопрос в том, почему это дает отрицательные результаты, я плохо кодирую!? Я также пробовал mktime, но все тот же результат.

Спасибо, Танмай.


person jtanmay    schedule 12.08.2010    source источник
comment
@Все: Спасибо за быстрые ответы. Это действительно помогло бы мне лучше понять временные метки. Спасибо.   -  person jtanmay    schedule 12.08.2010
comment
@Everyone: мне стало немного любопытнее, так есть ли способ получить отметку времени до 1901 года, я пробовал с помощью strtotime, но он всегда возвращает мне 0. Есть ли способ получить метку времени для предыдущих дат?   -  person jtanmay    schedule 12.08.2010


Ответы (6)


Это связано с эпохой Unix.

См.: date() и time()

Допустимый диапазон метки времени обычно составляет от пятницы, 13 декабря 1901 года, 20:45:54 по Гринвичу, до вторника, 19 января 2038 года, 03:14:07 по Гринвичу. (Это даты, соответствующие минимальному и максимальному значениям для 32-битного целого числа со знаком). Однако до PHP 5.1.0 этот диапазон был ограничен от 01-01-1970 до 19-01-2038 на некоторых системах.

person Blair McMillan    schedule 12.08.2010
comment
Спасибо за ваше объяснение и ссылки на руководство по php. Это действительно помогло хорошо понять временную метку. @Все, спасибо за ваше время и поддержку в моей учебной жизни. - person jtanmay; 12.08.2010
comment
это сделало меня немного более любопытным, так что есть ли способ получить метку времени до 1901 года, я пробовал с помощью strtotime, но он всегда возвращает мне 0. Есть ли способ получить метку времени для предыдущих дат? - person jtanmay; 12.08.2010
comment
Временные метки UNIX ограничены 32-битными целыми числами на 32-битных машинах, поэтому ваш эффективный диапазон составляет 1901-2038 или около того. Вместо этого используйте php.net/datetime, если вам нужен больший диапазон или вы переходите на 64-разрядную платформу. (bugs.php.net/bug.php?id=50913) - person Blair McMillan; 13.08.2010
comment
Спасибо за ответ. Я также осмотрелся и нашел библиотеку ADODB, которая давала мне отметку времени за пределами диапазона. sourceforge.net/projects/adodb/files . Опять же, я не уверен, как это работает. Просто упомянул об этом здесь, чтобы кому-то можно было помочь. Спасибо - person jtanmay; 13.08.2010
comment
И просто чтобы добавить к комментарию выше, это файл adodb-time.inc.php из zip, который мне пригодился. - person jtanmay; 13.08.2010

Это ожидаемое поведение.

strtotime возвращает отметку времени UNIX, количество секунд с 1 января 1970 года (без учета високосных секунд). Для дат до этого он вернет отрицательное число.

person Artefacto    schedule 12.08.2010

Время Unix начинается с эпохи Unix, то есть в полночь 1 января 1970 года. Таким образом, любая дата до этого приведет к возврату отрицательного значения.

person John Conde    schedule 12.08.2010

Это временная метка Unix. Базовая дата Unix/PHP — 1 января 1970 года, 00:00 UST, а отметка времени измеряется в секундах. Если отрицательное, это количество секунд до базовой даты; если положительный, количество секунд после

person Mark Baker    schedule 12.08.2010

Я все еще учусь с отметкой времени,

google unix timestamp -> http://en.wikipedia.org/wiki/Unix_time

определяется как количество секунд, прошедших с полуночи по универсальному скоординированному времени (UTC) 1 января 1970 года.

person Your Common Sense    schedule 12.08.2010

http://en.wikipedia.org/wiki/Unix_time

Время Unix, или время POSIX, — это система для описания моментов времени, определяемая как количество секунд, прошедших с полуночи по универсальному скоординированному времени (UTC) 1 января 1970 года, не считая високосных секунд. Он широко используется не только в Unix-подобных операционных системах, но и во многих других вычислительных системах и форматах файлов. Это не линейное представление времени и не истинное представление UTC (хотя его часто ошибочно принимают за оба), поскольку время, которое оно представляет, является UTC, но не представляет собой стандартные дополнительные секунды UTC (например, 31 декабря 1998 г., 23:59:60). )...

Время до 01.01.1970 является отрицательным значением, поскольку оно произошло до начала UTC.

person Bryon Hibbetts    schedule 12.08.2010