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 и друга към централното устройство, за да отчита разликата в часовата зона спрямо 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 във всяка часова зона и да го добавите към вашия времеви печат Бинго !!!

 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