Xpoint
   [напомнить пароль]

Как правильно узнать UTC-время в виде числа секунд с 1.01.1970?

Метки: [без меток]
[удл]
2010-12-05 23:51:45 [обр] Даниэль Алиевский(5/125)[досье]

Позвольте небольшой глупый вопрос по малознакомому мне PHP. Google выдает слишком много мудрствований вокруг него, а вопрос-то тривиальный: хочу корректно узнать число секунд с "начала эпохи" (начала 1970 года), не зависящее от местоположения сервера? Т.е. эквивалент JavaScript-вызова new Date().getTime()/1000? Верно ли я понял, что нужно вызывать gmmktime(), или простой вызов time() делает то же самое?

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

спустя 12 часов [обр] Давид Мзареулян(536/1003)[досье]
time
Юникстайм по определению не зависит от часового пояса.
спустя 1 час 6 минут [обр] Даниэль Алиевский(5/125)[досье]
Спасибо. Это есть то, чего я о юниксе не знал. Т.е. есть гарантия, что time() и gmmktime() (без аргументов) всегда выдают одно и то же? Типа, юникс, в котором не настроена правильно time zone, есть попросту нерабочий юникс? И PHP на Windows-сервере, который определяет time() на основе системных часов компьютера, если time zone в Windows настроена неверно, следует расценивать как нерабочий PHP?
спустя 32 минуты [обр] Давид Мзареулян(536/1003)[досье]

http://ru.wikipedia.org/wiki/UNIX-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F — это определение. Число секунд от фиксированной точки до настоящего момента не может зависеть от часового пояса.

А гарантии даёт только РосГосСтрах.

спустя 5 минут [обр] Даниэль Алиевский(5/125)[досье]
сообщение промодерировано

Когда-то давно единственное, на что могла опираться OS вроде DOS или ранних Windows - показания часов, т.е. текущих даты и времени, за правильность которых всецело отвечал пользователь... А в UNIX, оказывается, требование знать часовой пояс было сделано стандартом с самого начала. Что ж, это замечательно.

Большое спасибо.

спустя 3 часа 10 минут [обр] Давид Мзареулян(536/1003)[досье]
Если на сервере настроен ntpd, то Вам абсолютно пофигу, что показывают системные часы и какая где таймзона.
спустя 3 часа 20 минут [обр] Давид Мзареулян(536/1003)[досье]
А без внешних служб точного времени, конечно, в любой системе всё определяется правильностью машинных часов. Но NTP сейчас в обязательном порядке везде используется.
спустя 1 час 46 минут [обр] Евгений Седов aka KPbIC(7/176)[досье]
Лучше сказать "должен использоваться". И за примерами далеко ходить не надо: Который час? А виндовые админы про NTP, похоже, вообще не в курсе, поэтому время в среднем московском офисе может запросто гулять в пределах четверти часа.
спустя 26 минут [обр] Давид Мзареулян(536/1003)[досье]
Не большой специалист по винде, но вот это в моей семёрке было включено по умолчанию: http://i.min.us/iIaru.png
спустя 4 часа 45 минут [обр] Евгений Седов aka KPbIC(7/176)[досье]
сообщение промодерировано
Обычно в офисе рабочие станции синхронизируются с сервером. А откуда берется время на сервере, науке не известно.
спустя 4 часа 30 минут [обр] ddd(0/36)[досье]
Обычно в офисе рабочие станции синхронизируются с сервером. А откуда берется время на сервере, науке не известно.

Откуда админ настроит, оттуда и будет браться. Мне кажется это очевидно.

Прошу прощения за оффтоп.

спустя 5 часов [обр] 30-ый(18/584)[досье]

В 2000-ом сервере по умолчанию не бралось ни от куда. Если заглянуть в Event Log контроллера домена, то там каждый день появлялись Warning'и от сервиса Win32Time, о том, что синхронизация не настроена.

В 2003-ем сервере синхронизация по умолчанию настроена с NTP сервером time.windows.com. Вот тут можно почитать: http://support.microsoft.com/kb/816042

Кстати по теме. Я не берусь отвечать за все способы посчитать секунды, но теоретически есть очень много способов получить разницу в пару сотен милисекунд из-за различий рассчетных алгоритмов. Кроме часового пояса и зимного и летного времени есть еще поправочные секунды, которые переодически добавляют из-за замедления вращения земли. На эту тему много понаписано, если запросить у гугла что-то типа "UTC vs. GMT".

спустя 32 минуты [обр] Даниэль Алиевский(5/125)[досье]

30-ый[досье] Мелкие поправки для меня несущественны. В любом случае между временем из JavaScript и временем из PHP будет разница, связанная с временем соединения (отправка POST-запроса). Мне важно не получить ошибку, равную числу часовых поясов, например, 11, из-за того, что неправильно понял документацию к функции time(). В конечном счете я проверяю, что разница JavaScript- и PHP-времени не превосходит 12 или 24 часов, позволяя пользователю даже иметь часы, сбоящие на пару часов по невнимательности. (Видел я такие компьютеры, и причин глюка, наверно, может быть много: часы много лет отстают, а сервис NTP не включен, выбрана Россия вместо Израиля, соответственно переход на летнее время делается не в те месяцы, и т.п.) Но, конечно, все-таки в качестве времени нужно постараться получить на обоих концах связи именно GMT-время, а не локальное. В случае JavaScript особых вопросов не возникает, ибо new Date() возвращает текущее время во всех его ипостасях, и в этом объекте есть методы и для выдачи UTC-времени, и для выдачи локального времени. Про метод getTime() сказано однозначно - это GMT, и никаких других способов получить число секунд с начала эпохи просто нет. В Perl тоже есть только одна функция с таким смыслом: time(). А в PHP развели изобилие функций...

Кстати, что странно, этот прозрачнейший и простейший способ защиты почему-то мало обсуждается. Все про капчу говорят или про более изысканные способы испортить пользователю нервы. А у меня на WebWarper сей простейший способ сразу отрезал весь спам, хотя ресурс куда популярнее типичного среднего уровня. Почему так? Само собой, защита ломается любым роботом, который интерпретирует JavaScript и DOM (скажем, использует ActiveX MSIE), но ведь на практике 99.99% спама (или больше?) генерируется куда более "тупо". Тем более что можно написать JavaScript-библиотечку, которая противостоит и таким умным роботам, используя методы борьбы с отладчиками: например, будет проверять, что действительно происходили клавиатурные события, соответствующие реальному заполнению формы, и что между ними были правдоподобные для человека временные интервалы.

спустя 41 минуту [обр] Евгений Седов aka KPbIC(7/176)[досье]
Даниэль Алиевский[досье] Где-то мне попадалась такая тема на Точке. Может быть, даже вы были ее автором. Что-то в стиле "Простейшие приемы борьбы со спамом". Не могу найти только.
спустя 19 минут [обр] Евгений Седов aka KPbIC(7/176)[досье]

Даниэль Алиевский[досье] Вы не находите, что методы лучше продолжать обсуждать в тех темах, а эту оставить под "время"?

Простые способы защиты от спама: почта и гостевая
Очень тупой метод борьбы со спамом

спустя 26 минут [обр] Даниэль Алиевский(5/125)[досье]
И правда, я и создавал те темы... Давно дело было. Спасибо, что нашли.
спустя 21 минуту [обр] Евгений Седов aka KPbIC(7/176)[досье]
30-ый[досье] Может быть, многие до сих пор сидят на 2000-м или боятся по известным причинам лезть на майкрософтовские сервера (протокол закрыт?). Я в Windows не разбираюсь, но проблема со временем есть, я с этим сталкиваюсь постоянно.
спустя 3 часа 42 минуты [обр] Давид Мзареулян(536/1003)[досье]
Евгений Седов aka KPbIC[досье] C чего он вдруг закрыт? Обычный NTP там.
спустя 11 месяцев [обр] Евгений Седов aka KPbIC(7/176)[досье]
Скорее всего, SNTP.
Powered by POEM™ Engine Copyright © 2002-2005