Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   date() и часы на компьютере показывают разные значения (https://javascript.ru/forum/misc/74514-date-i-chasy-na-kompyutere-pokazyvayut-raznye-znacheniya.html)

arkadii_parovozov 17.07.2018 18:40

date() и часы на компьютере показывают разные значения
 
Всем привет!

По сути вопрос в теме. Если более подробно, то: вывожу время на странице (в браузере) с помощью date(), весь код часов:

function SimpleClock()
{
    //создаем объект с текущей датой и временем
    var tekDate = new Date();
    //получаем из объекта часы, минуты и секунды
    var hour = tekDate.getHours();
    var minute = tekDate.getMinutes();
    var seconds = tekDate.getSeconds();
    //определ¤ем день недели
	var now = new Date();
	var dayNames = new Array("Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота");
	var now = new Date();
	var textout;
	var month = now.getMonth();
	var date = now.getDate();
	textout = date;
	if (month==0) textout+=" Января";
	if (month==1) textout+=" февраля";
	if (month==2) textout+=" марта";
	if (month==3) textout+=" апреля";
	if (month==4) textout+=" мая";
	if (month==5) textout+=" июня";
	if (month==6) textout+=" июля";
	if (month==7) textout+=" августа";
	if (month==8) textout+=" сентября";
	if (month==9) textout+=" октября";
	if (month==10) textout+=" ноября";
	if (month==11) textout+=" декабря";
    //дл¤ того чтобы минуты и секунды до 10 отображались корректно с нулем
    minute=((minute < 10) ? "0" : "") + minute;
    seconds =((seconds < 10) ? "0" : "") + seconds;
    //смотрим чтобы часы не переваливали за 24 
    hour=(hour > 24) ? hour-24 : hour;
    hour=(hour == 0) ? 0 : hour;
    //задаем окончательное значение времени
    var clock = hour + ":" + minute + ":" + seconds;
    //отрисовываем врем¤ на странице
    if(clock != document.getElementById('idClock').innerHTML){ 
			$("#idDate").html(textout+" "+now.getFullYear()+" <br><font size='-1' color='#999'>"+dayNames[now.getDay()]+"</font>");
			document.getElementById('idClock').innerHTML = clock;
			if(month<12){month=month+1;}
			if(month<10){month="0"+month;}
			if(date<10){date="0"+date;}
			$("#data_klient").val(now.getFullYear()+"-"+month+"-"+date+" "+clock);
	}
	//выполн¤ем все это каждую секунду
    timer = setTimeout("SimpleClock()",1000);
}


Далее отправляю эти данные аяксом (по событию) на сервер, просто перекидываю и записываю в БД. И всё работает как надо и никаких проблем. Но появился пользователь который заметил что в БД записывается время на один час меньше чем показывают его часы на компьютере.

Скажите как такое может произойти?
Откуда берет своё значение объект date?

j0hnik 17.07.2018 18:59

Цитата:

Сообщение от arkadii_parovozov
Откуда берет своё значение объект date?

С компьютера клиента

arkadii_parovozov 17.07.2018 19:04

Цитата:

Сообщение от j0hnik (Сообщение 489970)
С компьютера клиента

Это логично. Я даже менял время системы, и на странице (в браузере) время часов тоже менялось.

Но пользователь присылает скриншот экрана с часами, и временем которое записалось в БД, и в БД разница на один час меньше. Как такое может произойти?

laimas 17.07.2018 19:10

Цитата:

Сообщение от arkadii_parovozov
Как такое может произойти?

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

arkadii_parovozov 17.07.2018 19:16

Цитата:

Сообщение от laimas (Сообщение 489973)
Если в базу пишется то, что прислал клиент, то никакого сдвига быть не может.

А как это можно вбить в голову клиенту? Вот он видит у себя на часах (на мониторе) одно время, а в бд прилетает время на один час меньше, притом, я в базу просто записываю то что находится здесь: $("#data_klient").val(now.getFullYear()+"-"+month+"-"+date+" "+clock);

Может такое быть то браузер показывает одно время а часы компьютера другое? И из за чего такое может быть?

j0hnik 17.07.2018 19:17

Цитата:

Сообщение от arkadii_parovozov
Может такое быть то браузер показывает одно время а часы компьютера другое? И из за чего такое может быть?

у браузера своих часов нет.

laimas 17.07.2018 19:22

Я не знаю конфигурацию вашего сервера, но у БД свои настройки системного времени. Но как бы то ни было, хостер никогда не установит разное время для сервера и БД. Системное время сервера в базу запишется только тогда, когда вы будет использовать функции базы, например NOW() в MySQL.

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

arkadii_parovozov 17.07.2018 19:48

laimas, спасибо! Но БД на моем сервере здесь не причем. Я тупо записываю то время которое присылает клиент. То есть, если от клиента я получаю такое время: 2018-11-28 17:15:18 то я его таким и записываю.

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

Понятное дело что я проверяю на своем компьютере и не только, и такого не наблюдаю. Но это не означает что такое не может быть, или означает?

j0hnik 17.07.2018 19:52

arkadii_parovozov,
значит нужно копать глубже, C# .NET форуме попробуйте поспрашивать

laimas 17.07.2018 19:52

Если в базу пишется 2018-11-28 17:15:18, которое прислал клиент, извлекается и выводится ему же, например сразу, то разница может быть в секундах или минутах так как и время не стоит на месте, плюс время на запрос/ответ.

laimas 17.07.2018 19:55

j0hnik,
а причем тут .NET и C#?

Nexus 17.07.2018 19:58

arkadii_parovozov, как дату из бд на страницу выводите?

j0hnik 17.07.2018 19:59

laimas,
мб с настройками винды как то связано.

laimas 17.07.2018 20:03

Цитата:

Сообщение от j0hnik
мб с настройками винды как то связано.

Как? Тут работа чисто JS с системным временем - получили, разобрали, сохранили что получили. Выводим как есть (судя по описанию) - разница будет равна текущему времени на клиенте минус время сохраненное.

j0hnik 17.07.2018 20:27

laimas,
в его js коде нет ничего что бы переводило время на час, там более проблема у одного человека, поэтому и такой вывод.

laimas 17.07.2018 20:32

Цитата:

Сообщение от j0hnik
в его js коде нет ничего что бы переводило время на час

А зачем переводить на час? А если системное время учитывает переход на час, то и new Date() вернет время с учетом перевода, оно же и будет сохранено.

Rise 17.07.2018 20:34

Цитата:

Сообщение от arkadii_parovozov
Но появился пользователь который заметил что в БД записывается время на один час меньше чем показывают его часы на компьютере.

Как он это заметил, у него что есть доступ в БД?
Цитата:

Сообщение от arkadii_parovozov
Пользователь утверждает что то время которое выводится у него на странице (которое я ему вывожу функцией date() в его-же браузере) показывает время на один час меньше чем показывают его часы на компьютере (системные часы в нижнем углу).

Что-то ничего не понял, то у вас строка времени в базе не так записывается, то уже date() не то показывает, где истина?
Цитата:

Сообщение от arkadii_parovozov
Но пользователь присылает скриншот экрана с часами, и временем которое записалось в БД, и в БД разница на один час меньше.

Ну вот опять что это? Как он делает скриншоты БД?? Бред какой-то...

j0hnik 17.07.2018 20:35

Цитата:

Сообщение от Rise
Как он это заметил, у него что есть доступ в БД?

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

arkadii_parovozov 17.07.2018 20:48

Вложений: 1
laimas, j0hnik правильно мою мысль уловил. Суть в том что до БД дело не доходит, разница во времени у самого клиента (как он утверждает), типа на экране часы тикают и показывают одно время на на системных часах тикает время с один часом разницы.

Вот скрин:

в верхнем правом углу время которое я вывожу js (текущее время сервера), а в правом нижнем углу время системы

Rise 17.07.2018 20:49

j0hnik,
Ну если через час выводится конечно будет разница :D

Rise 17.07.2018 20:53

Цитата:

Сообщение от arkadii_parovozov
Суть в том что до БД дело не доходит, разница во времени у самого клиента

А фигли ты нам этой БД голову морочишь? Date() работает от машины клиента, клиент тролль видимо... скрина не видно... да и подкрутить время и сделать скрин не проблема...

arkadii_parovozov 17.07.2018 20:53

Nexus, Rise, j0hnik, laimas, посмотрите это сообщение: https://javascript.ru/forum/490003-post19.html

arkadii_parovozov 17.07.2018 20:57

Цитата:

Сообщение от Rise (Сообщение 490005)
А фигли ты нам этой БД голову морочишь? Date() работает от машины клиента, клиент тролль видимо... скрина не видно... да и подкрутить время и сделать скрин не проблема...

Изначально я сам думал что с БД связано, а когда добрался до его компа (по удалёнке), то сам в этом убедился, проблема у него, и с БД не связанно. Клиент не тролль, я сам снимок делал. И я тоже не тролль )) Реально такая фигня происходит. В чем может быть проблема?

Rise 17.07.2018 20:58

Цитата:

Сообщение от arkadii_parovozov
в верхнем правом углу время которое я вывожу js (текущее время сервера)

Текущее время сервера? :blink: Теперь это уже время сервера, а не клиента??

laimas 17.07.2018 20:59

Цитата:

Сообщение от arkadii_parovozov
aimas, j0hnik правильно мою мысль уловил.

Мысль о чем, о C и .NET? А они каким боком тут?

Хотите сказать, то ваш таймер (JS) берет время с учетом/без летнего времени? Нет у браузера и JS своего времени.

arkadii_parovozov 17.07.2018 21:07

Вложений: 1
Чтобы не создавать новую тему, попробую сформулировать вопрос заново:

Почему объект Date() показывает время на один час меньше чем отображается в системных часах компьютера?

Вот скрин:

j0hnik 17.07.2018 21:07

Цитата:

Сообщение от laimas
Мысль о чем, о C и .NET? А они каким боком тут?

В форуме С# люди шарят в винде лучше чем мы с вами. Вот таким боком.

Rise 17.07.2018 21:08

arkadii_parovozov,
Вы хоть посмотрите у вас даже форматы вывода разные из скрина и из первого поста, где у вас год, месяц, число, дефисы на скрине?
$("#data_klient").val(now.getFullYear()+"-"+month+"-"+date+" "+clock);

laimas 17.07.2018 21:11

Цитата:

Сообщение от j0hnik
В форуме С# люди шарят в винде лучше чем мы с вами. Вот таким боком.

При чем тут C?

<div id="tm"></div>
<script>
setTimeout(function run() {
  document.getElementById('tm').innerHTML = new Date();
  setTimeout(run, 1000)
}, 1000);
</script>


Показано время и смещение часового пояса. Разрешите в настройках переход на летнее время, что таймер и системные часы будут отображать разное время?

arkadii_parovozov 17.07.2018 21:13

Rise, Вы специально уводите тему в сторону? Вывожу я данные часов здесь:
document.getElementById('idClock').innerHTML = clock

а в таком формате:
$("#data_klient").val(now.getFullYear()+"-"+month+"-"+date+" "+clock);


я отправляю данные в БД. Но не о передаче данных идет речь. Речь идет о том почему clock в браузере один а в системе другой?

j0hnik 17.07.2018 21:18

laimas,
если у вас есть решение, напишите! не стесняйтесь
если дело не в браузере надо ковыряться в ОС

laimas 17.07.2018 21:23

j0hnik, а вы встречали браузер или ОС, в котором бы JS работал со временем отличным от системного?

Rise 17.07.2018 21:25

Цитата:

Сообщение от arkadii_parovozov
Вывожу я данные часов здесь: ... а в таком формате: ... я отправляю данные в БД.

Допустим. А где остальной текст перед днем недели тогда? День недели у вас определяется только здесь, и не в одиночестве, как на скрине?
$("#idDate").html(textout+" "+now.getFullYear()+" <br><font size='-1' color='#999'>"+dayNames[now.getDay()]+"</font>");

j0hnik 17.07.2018 21:30

laimas,
нет не видел
ТС наё@@@@ет?

arkadii_parovozov 17.07.2018 21:32

Вложений: 1
Rise, там <br> стоит. На скрине он получается выше, я его замазал, так как разница только в одном часу. Но если имеет значение, то полный вывод такой:

laimas 17.07.2018 21:39

arkadii_parovozov,
откуда клиент?

arkadii_parovozov 17.07.2018 21:42

laimas, Москва, но точный адрес не скажу ))

j0hnik, вот мне просто делать больше нехера как строчить тут сообщения.

Я естественно кошу на ОС, но это нужно как-то обосновать, а не просто отмахнутся, типа: ничего не знаю это ваши проблемы...

laimas 17.07.2018 21:48

И не надо адреса. Значит не должно быть у него перехода на летнее время, а на час, значит только это может дать сдвиг у нас в стране. Но когда часы переводятся на час, переводится и системное время.

Можете у себя попробовать простой вывод таймером new Date(), но с учетом перехода на летнее время. Для этого зайдите в настройки дата/время и выберите любой часовой пояс отличный от наших по стране. При этом в настройках будет доступен флажок разрешающий переход на летнее время, он должен быть установлен.

Что будут показывать системные часы и часы таймера (если что, то систему перезапустите)? После вернете свой часовой пояс.

Rise 17.07.2018 21:48

arkadii_parovozov,
Просто странно что вы это называете текущее время сервера, вот я и думаю, то ли скрипт не тот, то ли время не сервера.

arkadii_parovozov 17.07.2018 21:51

Rise, я уже переформулировал вопрос: Почему объект Date() показывает время на один час меньше чем отображается в системных часах компьютера?
Здесь нет ни слова о серверном времени. Не сбивайте людей с толку.


Часовой пояс GMT +3, время: 17:03.