Время Unix на разных устройствах в разных часовых поясах

Допустим, у меня есть PHP-скрипт, который делает это:

$timeNow = 1349852400000; // Unix time for Oct 10, 2012 00:00:00 PDT
echo "<script type='text/javascript'>";
echo     "setTimeout(function(){alert('time out!');}, $timeNow - Date.now());";
echo "</script>";

Что, если этот сценарий будет отправлен на устройство, дата/время которого установлены на 2013 год. Что произойдет? Что, если это подается на устройство, дата/время которого установлены на 2010?

Имеет ли значение, на какое время и дату установлены часы сервера? Как это повлияет на устройство в 2013 году? А как насчет того, кто застрял в 2010 году?

Если бы я хотел выбрать значение для $timeNow, которое будет выдавать оповещение в тот момент, когда везде будет синхронизировано 10 октября 2012 г. в 00:00:00 для Сан-Франциско, Калифорния (то есть устройство, настроенное на тихоокеанское время, и устройство, установленное на центральное время должно отображать оповещение в тот же момент, даже если это будет 2:00:00 для устройства центрального времени), могу ли я это сделать? Не придется ли мне передавать одно значение для устройства Pacific и другое для устройства Central, чтобы учесть разницу часового пояса с UTC?

Извините, меня смущают часовые пояса. У меня проблемы с их обдумыванием.


person user438293456    schedule 05.10.2012    source источник
comment
Чего вы пытаетесь достичь? Кстати, вы намерены иметь отрицательное значение в качестве тайм-аута в миллисекундах?   -  person akostadinov    schedule 05.10.2012
comment
Я пытаюсь выяснить, как работает эта временная штука. Отсюда и конкретные вопросы. В каком случае я получу отрицательное значение в качестве времени ожидания в миллисекундах?   -  person user438293456    schedule 05.10.2012


Ответы (2)


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

Unix-время 0

  • 1 января 1970 года, полночь по зулусскому времени.
  • 31 декабря 1969 года, 16:00 по времени Сан-Франциско.

Таким образом, если вы настроите оповещение на время 0, люди в Сан-Франциско и Лондоне увидят оповещение одновременно. То же самое для любого времени Unix, которое на самом деле просто число, описывающее момент времени. Одно и то же мгновение во всем мире. Таким образом, обе следующие строки даты и времени

  • 1970-01-01T00:00:00Z
  • 1969-12-31T16:00:00-0800

являются представлениями одного и того же момента, обозначаемого Unix time 0.

Точно так же все в мире видят время 1349852400000 в один и тот же момент, независимо от их часового пояса. Таким образом, поскольку ваш код пытается оповестить что-то в определенный момент времени, описываемый временем Unix, ваш код в принципе должен работать, при условии, что на компьютерах, на которых выполняется скрипт, установлено правильное время.

Я полагаю, что если вы действительно хотите, чтобы куча компьютеров оповещала о чем-то одновременно (вы пишете вирус? Шучу), и вы хотите справиться со случаем, когда устройства могут иметь неправильные часы, вы можете сделать так, чтобы они звонки на центральный сервер времени и установить время ожидания на основе этого. Тогда вам, вероятно, придется иметь дело с межсайтовыми проблемами, но в принципе, если все машины согласны разговаривать и принимать данные с центрального сервера времени, вы можете это сделать.

ДОПОЛНЕНИЕ

Вот как это может работать. Допустим, ваш скрипт работает на нескольких машинах. У них у всех неправильно настроены часы. Может быть, они намеренно неправильно установили часы; возможно, они случайно неправильно установили часы. Но вы хотите, чтобы все они были предупреждены одновременно.

Итак, ваш сценарий должен сделать следующее: сделать вызов (Ajax) на ваш сервер — тот же сервер, который доставил HTML-страницу, в которую встроен сценарий, чтобы упростить межсайтовые проблемы. Этот вызов говорит с вашим сервером, который знает реальное время. Теперь вы также знаете время с этого момента до времени оповещения. Поэтому вычтите эти два значения на вашем сервере и верните клиентам это число. Затем клиенты делают

setTimeout(theAlertFunction, theValueReturnedFromTheAjaxCall)

и вы можете идти.

person Ray Toal    schedule 05.10.2012
comment
Ха, мой вопрос звучит так, будто у него злонамеренные намерения? Я даже не понял! Я только что придумал сценарий для вопроса, ответ на который поможет мне понять, как работает время Unix. Спасибо! - person user438293456; 05.10.2012
comment
Ничего страшного, я пошутил, конечно. Мысль о предупреждении, появляющемся одновременно во всем мире в одно и то же мгновение, просто навела меня на мысль о вирусах. Не знаю почему. ;-) - person Ray Toal; 05.10.2012
comment
Итак, я все еще смущен устройствами, у которых дата/время установлены неправильно. Что, если это не результат проблемы с синхронизацией времени, а пользователь по какой-то причине вручную устанавливает время вперед или назад? Имеет ли значение, что тот факт, что на компьютере не установлено правильное время, инициирован пользователем? - person user438293456; 05.10.2012
comment
Как говорится в других ответах, если кто-то по какой-либо причине намеренно установил свои часы неправильно, то при выполнении Date.now() они получат неправильное текущее время, и ваш код не будет работать. Единственный способ гарантировать, что все компьютеры, на которых выполняется ваш сценарий, — это сделать Ajax-вызов на централизованный сервер, который возвращает время до оповещения, и заставить их ответить вызовом setTimeout для этой задержки. - person Ray Toal; 05.10.2012
comment
И когда системное время НЕ установлено в UTC, что было распространено, по крайней мере, для машин Windows в прошлом, это зависит от реализации, если будет использоваться UTC. Кроме того, когда системные часы настроены на местное время, а не на UTC, есть некоторые моменты времени, которые невозможно надежно преобразовать в UTC (за час до/после перехода на летнее время). - person akostadinov; 05.10.2012

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

вы можете сместить время от UTC в любом часовом поясе и добавить его к своей отметке времени Bingo !!!

 var d = new Date(); 
    var yourCorrectDate = new Date(timeNow +(d.getTimezoneOffset() * 60000)); 
// timenow is the time your server has sent

дает вам смещение в минутах

d.getTimezoneOffset() 
person Rupesh Patel    schedule 05.10.2012