17.07.2018, 23:24
|
Кандидат Javascript-наук
|
|
Регистрация: 24.11.2016
Сообщений: 101
|
|
Ребята, спасибо всем за помощь!
laimas, оказывается перезагружать систему при смене поясов не обязательно. Достаточно только перезапустить браузер (если просто закрыть и открыть вкладку ничего не меняется).
И если даже переключить на (переход на летнее время), то все равно показывает правильные значения, главное перезапустить браузер после манипуляций с системным временем.
Так что получается, что браузер типо кэширует время сервера при запуске и потом js не имеет прямого доступа к системному времени?
|
|
17.07.2018, 23:29
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от arkadii_parovozov
|
главное перезапустить браузер после манипуляций с системным временем
|
Я же писал, что не запускать скрипт при смене (или перегрузить систему, браузер). Просто объект Date получает метку, которую и использует.
То есть при смене летнего или без него все равно значения одинаковы?
|
|
18.07.2018, 04:35
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от arkadii_parovozov
|
js не имеет прямого доступа к системному времени?
|
Все работает по RTC, это и есть системное время, часы реального времени. Система получает метку от реальных часов и далее отдает их для всех в системе посредством высокоточного таймера (не помню точно как он дразнится) как системное время, включая и часы которые идут. Не думаю чтобы JS работал напрямую с железом компьютера (RTC, это и есть "железяка" на материнской плате, ради которой на ней устанавливается и батарейка), об этом говорит и поведение скрипта при смене часового пояса.
Я потому и писал о неожиданности, которой в общем быть не должно. RTC изменяется как раз в настройках дата/время или в BIOS. При смене часового пояса, а значит и изменении времени, программы реагируют на изменения, например редактор будет предлагать сохранить изменения в открытых файлах. Почему я и не стал проверять то, что мог и упустить, меняя часовой пояс, слишком много файлов открыто было, чтобы все перещелкать.
Теперь можно и проверить. Все нормально, как и ожидалось, и должно быть, js сценарий отображает ровно то, что на системных часах. Но я ошибался, предлагая эксперимент, предполагая, что можно будет отловить использование или нет перехода на летнее время. Если сменить часовой пояс (сейчас как раз лето) на пояс с переходом на летнее время, то системные часы будут переведены на N часов вперед (согласно выбранному часовому поясу). Если снять флажок разрешающий переход на летнее время, то переводить часы назад придется вручную, ОС не изменит время. Естественно, что все эти изменения будут отражаться и на RTC, что можно проверить перезапуском системы. А значит и у клиента бага связанного с летним временем быть не должно. По идее такое можно было наблюдать один раз, когда js сценарий запущен и произошел системный переход на летнее время, что при последующем запуске браузера было бы устранено.
По идее так, вот как только проверить такой момент (эмулировать) я не знаю. О чем я знаю, о единственном баге со временем, это то, что системные часы и часы BIOS могут расходиться в показаниях на N секунд. Это связано как раз с точным таймером отдающем системное время приложениям. Об этом можно почитать на официальном сайте мелкософта.
|
|
18.07.2018, 10:46
|
Кандидат Javascript-наук
|
|
Регистрация: 24.11.2016
Сообщений: 101
|
|
laimas, Спасибо! Да, все работает правильно если перезапускать браузер.
И что интересно, другие программы реагировали мгновенно на смену времени, нотпад сразу же предлагал сохранить изменения. А браузер получается берет метку при запуске и далее работает с ней сам.
Но ведь можно-же утверждать, что js не работает с системным временем, иначе он бы реагировал на изменения как и нотпад? Если даже не мгновенно, то хотя бы при создании нового объекта Data(). Но так как при перезагрузки страницы ничего не меняется, значит можно сделать вывод что js не отображает системное время в реальном времени, а то время которое было зафиксировано при запуске браузера.
|
|
18.07.2018, 11:47
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от arkadii_parovozov
|
можно-же утверждать, что js не работает с системным временем
|
Нет, ибо нет ни у него, ни у кого иного своего времени. Вообще говоря о дате/времени в программной области, отсчет его ведется от искусственной метки, эпохе Unix, которая начинается с 1970 года. Если создать объект Date с некорректными параметрами как раз и будет возвращаться метка этой эпохи.
Сама ОС ведь не делает обслуживание аппаратных прерываний RTC каждую секунду, а берет текущую метку, на базе которой и создает системное время для ПО. Но она корректирует RTC к примеру по сигналам точного времени, которые выбраны в настройках. Есть и "крякушки" той же ОС, которые базируются на том, что подсовывают Windows "прожитое время", выдавая его за текущее, тем самым заставляя думать ОС, что пробный бесплатный период еще не закончился.
Я не автор JS и бог его знает как он поступает, но уж точно доступ к системному железу он не имеет, иначе бы дыр в безопасности было бы немеряно. Получается, что он берет метку, которую затем и использует. Система же не просто "диспетчер", но и еще и генерирует события "windows messages", которые могут получать и использовать прикладные программы. И в случае смены часового пояса, перехода на летнее время, система обязательно установит соответствующее событие, а далее уж хозяин барин реагировать на него или нет. Получается, что браузеру/JS по барабану это, "не царское дело в ...".
|
|
18.07.2018, 12:42
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Rise
|
возможно это баг нового браузера Firefox Quantum
|
Да, видимо так, только Firefox Quantum и лажает, тоже на всех имеющихся в системе проверил, такая же байда.
|
|
18.07.2018, 12:51
|
Кандидат Javascript-наук
|
|
Регистрация: 24.11.2016
Сообщений: 101
|
|
Сообщение от Rise
|
Как это объяснить, он что путешествовал, менял время на ноуте и браузер долго не закрывал?
|
Все верно кроме "путешествовал". Я не буду объяснять структуру и логику работы сайта, но могу уверить Вас в том что клиент именно так и поступал. Браузер может долгое время не закрываться, но иногда нужно поменять системное время. И фокус в том, что если просто на часах менять время, то срабатывает все правильно, а если часовой пояс менять или переключать на смену времени, по время разное. Видимо ковырялся в настройках времени при работающим браузере, вот и проявился баг.
|
|
|
|