|
|
|
| Есть текущее время, определяемое php скриптом. И нужно чтобы javascript использовал его как исходное для часов.
Иными словами как сделать часы на Javascript, только с учетом, что время должно быть не текущее у пользователя, а заданное скриптом пхп? | |
|
|
|
|
|
|
|
для: Atom
(02.11.2005 в 00:14)
| | И это возможно.
Код взят с сайта на английском, переводить было лень, но в принципе там пошаговые комметарии и дураку понятны.
<!-- THREE STEPS TO INSTALL SERVERDATE TO JAVASCRIPT:
1. Save the code in a file called "servertime.php"
2. Copy the coding into the HEAD of your HTML document
3. Add the last code into the BODY of your HTML document -->
<!-- STEP ONE: Paste this code in a file called "servertime.php"
(without the quotes) and place it in the main directory of your site.
Change mode to executable - chmod 755 -->
<?php
/* Copyright 2005 Emery Wooten - www.mresoftware.com
This script is called from Javascript. It should be called before any
JavaScripts that use the date.
Place the statement below in the <head> section of your HTML page:
<script type="text/javascript" src="http://shamar.org/servertime.php"></script>
*/
// Supress errors
error_reporting(0);
/* If your server is not in your time zone, adjust it here. Mine is 1 hour East of me.
To use this variable, you will need to remove the "//".
// $myServerOffset = (+1) * 3600;
// Get server date
$mydate = date("U");
// Get Timezone offset
$myoffs = date("Z") - $myServerOffset;
// Adjust offsets for local machine
print "var tzoffset = $myoffs + (new Date().getTimezoneOffset()*60);";
// Set JavaScript variable to your server time as seen from client machine's location.
print "var servertimeOBJ=new Date(($mydate+tzoffset)*1000);";
?>
<!-- STEP TWO: Paste this code into the HEAD of your HTML document -->
<HEAD>
<script language="JavaScript" src="http://shamar.org/servertime.php"></script>
<script type="text/javascript">
<!-- Begin
/* This script and many more are available free online at
The JavaScript Source!! http://javascript.internet.com
Created by: Emery Wooten :: www.mresoftware.com */
// First thing, reference the variable.
var servertimeOBJ;
// Now check that it is set
if (servertimeOBJ != null){
var myscriptTime = servertimeOBJ;
}
// If server time not passed, use client's time
else{
var myscriptTime = new Date();
}
/* "myscriptTime" is a variable local to this script. Name it as you wish.
After the above code is executed, this local variable is used for all date/time
calculations performed by the script. If all works, this variable
contains the server date as a proper JavaScript date object. */
// End -->
</script>
</HEAD>
<!-- STEP THREE: Copy this code into the BODY of your HTML document -->
<BODY>
<script type="text/javascript">
<!-- Begin
document.write(myscriptTime)
// End -->
</script>
<p><center>
<font face="arial, helvetica" size"-2">Free JavaScripts provided<br>
by <a href="http://javascriptsource.com">The JavaScript Source</a></font>
</center><p>
<!-- Script Size: 2.48 KB -->
|
| |
|
|
|
|
|
|
|
для: codexomega
(02.11.2005 в 07:44)
| | Я наверное не правильно описАл проблему =) Мне нужно чтобы часы шли еще =) | |
|
|
|
|
|
|
|
для: Atom
(02.11.2005 в 20:03)
| | Этот ЯваСкрипт показывает часы с секундами.
Можно взять за основу и кое что подделать.
Для запуска данного скрипта используется:
<body onLoad="show_clock()">
var myfont_face = "Arial";
var myfont_size = "11px";
var myfont_color = "#333333";
var myback_color = "transparent";
var mywidth = 80;
var my12_hour = 1;
var dn = ""; var old = "";
if (document.all||document.getElementById) { document.write('<span id="LiveClockIE" style="width:'+mywidth+'px; background-color:'+myback_color+'"></span>'); }
else if (document.layers) { document.write('<ilayer bgColor="'+myback_color+'" id="ClockPosNS"><layer width="'+mywidth+'" id="LiveClockNS"></layer></ilayer>'); }
else { old = "true"; show_clock(); }
function show_clock() {
//show clock in NS 4
if (document.layers)
document.ClockPosNS.visibility="show"
if (old == "die") { return; }
var Digital = new Date();
var hours = Digital.getHours();
var minutes = Digital.getMinutes();
var seconds = Digital.getSeconds();
if (my12_hour) {
dn = "AM";
if (hours > 12) { dn = "PM"; hours = hours - 12; }
if (hours == 0) { hours = 12; }
} else {
dn = "";
}
if (minutes <= 9) { minutes = "0"+minutes; }
if (seconds <= 9) { seconds = "0"+seconds; }
myclock = '';
myclock += '<font style="color:'+myfont_color+'; font-family:'+myfont_face+'; font-size:'+myfont_size+'pt;">';
myclock += hours+':'+minutes+':'+seconds+' '+dn;
myclock += '</font>';
if (old == "true") {
document.write(myclock);
old = "die"; return;
}
if (document.layers) {
clockpos = document.ClockPosNS;
liveclock = clockpos.document.LiveClockNS;
liveclock.document.write(myclock);
liveclock.document.close();
} else if (document.all) {
LiveClockIE.innerHTML = myclock;
} else if (document.getElementById) {
document.getElementById("LiveClockIE").innerHTML = myclock;
}
setTimeout("show_clock()",1000);
}
|
| |
|
|
|
|
|
|
|
для: codexomega
(02.11.2005 в 20:50)
| | Малость модифицировал. Но не пойму, как ему передавать значения из php так, чтобы при смене времени он их увеличивал? Мне нужно чтобы время не зависело от вермени на компе
<script language="javascript">
var dn = ""; var old = "";
if (document.all||document.getElementById)
{
document.write('<span id="LiveClockIE"></span>');
}
else if (document.layers)
{
document.write('<ilayer id="ClockPosNS"><layer id="LiveClockNS"></layer></ilayer>');
}
else
{
old = "true"; show_clock();
}
function show_clock()
{
if (document.layers)
document.ClockPosNS.visibility="show"
if (old == "die") { return; }
var Digital = new Date();
//модификация тут. таким образом передаю время из скрипта
var hours = <?=gmdate("G") + 2?>; //Digital.getHours();
var minutes = Digital.getMinutes();
var seconds = Digital.getSeconds();
myclock = '';
myclock += hours+':'+minutes+':'+seconds;
if (old == "true")
{
document.write(myclock);
old = "die"; return;
}
if (document.layers)
{
clockpos = document.ClockPosNS;
liveclock = clockpos.document.LiveClockNS;
liveclock.document.write(myclock);
liveclock.document.close();
}
else if (document.all)
{
LiveClockIE.innerHTML = myclock;
}
else if (document.getElementById)
{
document.getElementById("LiveClockIE").innerHTML = myclock;
}
setTimeout("show_clock()",1000);
}
</script>
|
Но проблема в том, что если меняется час, то в этих часах время не изменяется. Совсем торможу :(( | |
|
|
|
|
|
|
|
для: Atom
(02.11.2005 в 23:45)
| | Ураа! Нашел.
Вот, с живым примером и скриптом:
http://www.javascriptkit.com/script/script2/servertime.shtml | |
|
|
|
|
|
|
|
для: Atom
(02.11.2005 в 23:45)
| | Атоm: немного не там вставил. Надо вместо var Digital = new Date(); писать
var Digital = <?=time()*1000?>
| . Проблема только в том, что нет контроля за скоростью передачи страницы, поэтому часы на странице будут отставать на (время загрузки) секунд от серверного времени.
И вообще, скрипт устаревший и имеет не нужные для России AM/PM.
codexomega: По-моему, лучше учиться писать свои скрипты, чтобы не привносить мусора в код сраницы, в котором рано или поздно придётся разбираться.
Поправил скрипт, и получилось:
<div id=time></div>
<script>
onload=function(){setInterval("clock1()",999);}
function clock1(){var D,m,s;document.getElementById('time').innerHTML=
(D=new Date()).getHours()+':'
+((m=D.getMinutes())<10?'0':'')+m+':'
+((s=D.getSeconds())<10?'0':'')+s;
}
</script>
| Менять на рнр надо, как и там, new Date(). Ведь намного короче. | |
|
|
|
|
|
|
|
для: 12345
(03.11.2005 в 00:41)
| | Секунды мне не важны, там часы без секунд.
Но не работает! Если в вашем скрипте стоит new Date то все ок, а если time()*1000 то не пашет
И немного непонятно, как мне с этим time() добиться времени GMT +2, при том что я совершенно не знаю какое там время будет на сервере :( | |
|
|
|
|
|
|
|
для: Atom
(03.11.2005 в 14:29)
| | А, да, забыл, что время из числа надо в объект даты перевести!
time() в рнр показывает системное время, и, действительно, нужно позаботиться о взятии гринвичского. Берём справочники JS (http://xlibscripts.land.ru/jscript_doc/JavaScript/DateJS.html) и рнр, и действуем.
<div id=time></div>
<script> DD=0;
onload=function(){Dphp=1131037423000; //=<?=gmmktime()*1000?>Гринв.вр.сервера в миллисекундах
//Для проверки поставлено время 20:03 MSK. Стартовать всегда будет с этого.
Djs=new Date(); //Местное время клиента в миллисекундах
DD=Dphp-Djs;//Эту разность будем прибавлять, чтобы получить серверное, но в местном поясе.
setInterval("clock1()",999);clock1();}
function clock1(){var D,m,s;
document.getElementById('time').innerHTML=
(D=new Date((new Date()).getTime()+DD)).getHours()+':'
+((m=D.getMinutes())<10?'0':'')+m+':' +((s=D.getSeconds())<10?'0':'')+s;
}
</script>
| Здесь, возможно, не то, что нужно Вам. Не местное серверное время, а как-то сдвинутое. В общем, инструмент Вам дал, а дальше - просьба разобраться в поправках, чтобы само везде работало и поделиться результатами. | |
|
|
|
|
|
|
|
для: 12345
(03.11.2005 в 20:28)
| | Я долго парился с временем по Гринвичу и пр, но так и не понял как задать время для Date(). Пробовал setTime(<?=gmmktime((gmdate("G")+2)*1000)?>) но не работает почему-то. Пробовал new Date(<?=gmmktime((gmdate("G")+2)*1000)?>), но получается статичное время(т.е. часы не идут). В итоге забил на эту затею, не могу на нее тратить столько времени. Если есть идеи, как реализовать - буду рад узнать =) | |
|
|
|
|
|
|
|
для: Atom
(03.11.2005 в 23:26)
| | Так не надо время форматировать в рнр! gmmktime()*1000 даёт всё необходимое, и брать нужно в миллисекундах, чтобы потом вычислить разность, как написано. Потом форматировать в JS, потому что именно JS выводит идущее время. | |
|
|
|
|
|
|
|
для: Atom
(03.11.2005 в 23:26)
| | Так не надо время форматировать в рнр! gmmktime()*1000 даёт всё необходимое, и брать нужно в миллисекундах, чтобы потом вычислить разность, как написано. Потом форматировать в JS, потому что именно JS выводит идущее время.
А я не очень представляю, что тебе нужно - то ли местное серверное, то ли переведённое в часовой пояс клиента. Но, так или иначе, отлаживать и дописывать лучше в деле, с рнр на основе моего скрипта, где все детали сделаны, осталось собрать.
Разнузданный пример с комментариями для слежения за серверным временем (исполнять в файле PHP):
<U>Местное время клиента:</U> <span id=timeK></span><br>
<U>Время сервера с переводом на зону клиента:</U> <span id=time></span><br>
<U>Местное время сервера:</U> <span id=timeS></span><br>
<script>d=document;
Dphp=<?=gmmktime()*1000?>;//Гринв.вр.сервера в миллисекундах
//Если пишется без пхп, заменить выражение числом 1131037423000 ,это будет 17:03 для MSK
d.write('Начальное время сервера: '+(new Date(Dphp))+'<br>');
Djs=(D=new Date()).getTime()-D.getTimezoneOffset()*60000; //Гринв.вр.клиента в миллисекундах
d.write('Начальное время клиента: '+(new Date(Djs))+'<br>');
DD=Dphp-Djs;//Разнобой часов. Прибавлять, чтобы получить серверное, но в местном поясе
dServM=<?=date('Z')/60?>;
d.write('Часовой пояс сервера: '+dServM+'<br>');
dKlientM=-(new Date()).getTimezoneOffset();
d.write('Часовой пояс клиента: '+dKlientM+'<br>');
DPoyas=(dServM-dKlientM)*60000;//Разность поясов. Прибавить, чтобы снова вернуться к местному серверному
onload=function(){
setInterval("clock1()",999);clock1();}
function clock1(){var D0,D,m,s;D0=new Date;
d.getElementById('timeK').innerHTML
=D0.getHours()+':'
+((m=D0.getMinutes())<10?'0':'')+m+':' +((s=D0.getSeconds())<10?'0':'')+s;
d.getElementById('time').innerHTML
=(D=new Date(D0.getTime()+DD)).getHours()+':'
+((m=D.getMinutes())<10?'0':'')+m+':' +((s=D.getSeconds())<10?'0':'')+s;
d.getElementById('timeS').innerHTML
=(D=new Date(D0.getTime()+DD+DPoyas)).getHours()+':'
+((m=D.getMinutes())<10?'0':'')+m+':' +((s=D.getSeconds())<10?'0':'')+s;
}
</script>
| Посмотри, пожалуйста, как работает, в правильную сторону ли прибавляет, а то проверял только на локальном. | |
|
|
|
|
|
|
|
для: 12345
(04.11.2005 в 01:30)
| | Результат -
Местное время клиента: 11:10:16
Время сервера с переводом на зону клиента: 11:10:15
Местное время сервера: 11:10:15
Начальное время сервера: Fri Nov 4 14:08:52 UTC+0300 2005
Начальное время клиента: Fri Nov 4 14:08:52 UTC+0300 2005
Часовой пояс сервера: 180
Часовой пояс клиента: 180
|
Первые два времени соответствуют текущему, а начальное с сервера и клиента неправильное... ( | |
|
|
|
|
|
|
|
для: Atom
(04.11.2005 в 11:15)
| | Почему неправильное, если 14:08 минус 3 часа есть 11:08 ? Это времена по Гринвичу (UTC) с указанием часового пояса. Тут, я вижу, правильно, и сервер с клиентом в одном часовом поясе. Интересно проверить случай, когда сервер и клиент будут в разных часовых поясах.
Сделал код покомпактнее:
<U>Местное время клиента:</U> <span id=timeK></span><br>
<U>Время сервера с переводом на зону клиента:</U> <span id=time></span><br>
<U>Местное время сервера:</U> <span id=timeS></span><br>
<script>d=document;
Dphp=<?=gmmktime()*1000?>;//Гринв.вр.сервера в миллисекундах
//Если пишется без пхп, заменить выражение числом 1131037423000 ,это будет 17:03 для MSK
d.write('Начальное время сервера: '+(new Date(Dphp))+'<br>');
Djs=(D=new Date()).getTime()-D.getTimezoneOffset()*60000; //Гринв.вр.клиента в миллисекундах
d.write('Начальное время клиента: '+(new Date(Djs))+'<br>');
DD=Dphp-Djs;//Разнобой часов. Прибавлять, чтобы получить серверное, но в местном поясе
dServM=<?=date('Z')/60?>;
d.write('Часовой пояс сервера: '+dServM+'<br>');
dKlientM=-(new Date()).getTimezoneOffset();
d.write('Часовой пояс клиента: '+dKlientM+'<br>');
DPoyas=(dServM-dKlientM)*60000;//Разность поясов. Прибавить, чтобы снова вернуться к местному серверному
onload=function(){setInterval("clock1()",999);clock1();}
function clock1(){var D0;hms('timeK',D0=new Date);
hms('time',new Date(D0.getTime()+DD));
hms('timeS',new Date(D0.getTime()+DD+DPoyas));
}
function hms(layr,X){var m,s; d.getElementById(layr).innerHTML
=X.getHours()+':'+((m=X.getMinutes())<10?'0':'')+m+':'+((s=X.getSeconds())<10?'0':'')+s;
}
</script>
|
| |
|
|
|
|
|
|
|
для: 12345
(04.11.2005 в 16:13)
| | Ещё лучше, без лишних переменных:
<U>Местное время клиента:</U> <span id=timeK></span><br>
<U>Время сервера с переводом на зону клиента:</U> <span id=time></span><br>
<U>Местное время сервера:</U> <span id=timeS></span><br>
<script>d=document;
Dphp=<?=gmmktime()*1000?>;//Гринв.вр.сервера в миллисекундах
//Если пишется без пхп, заменить выражение числом 1131037423000 ,это будет 17:03 для MSK
d.write('Начальное время сервера: '+(new Date(Dphp))+'<br>');
Djs=(D=new Date()).getTime()-D.getTimezoneOffset()*60000; //Гринв.вр.клиента в миллисекундах
d.write('Начальное время клиента: '+(new Date(Djs))+'<br>');
DD=Dphp-Djs;//Разнобой часов. Прибавлять, чтобы получить серверное, но в местном поясе
dServM=<?=date('Z')/60?>;
d.write('Часовой пояс сервера: '+dServM+'<br>');
dKlientM=-(new Date()).getTimezoneOffset();
d.write('Часовой пояс клиента: '+dKlientM+'<br>');
DPoyas=(dServM-dKlientM)*60000;//Разность поясов. Прибавить, чтобы снова вернуться к местному серверному
onload=function(){setInterval("clock1()",999);clock1();}
function clock1(){var D0;hms('timeK',D0=new Date);
hms('time',new Date(D0.getTime()+DD));
hms('timeS',new Date(D0.getTime()+DD+DPoyas));
}
function hms(layr,X){d.getElementById(layr).innerHTML=X.getHours()
+':'+(X.getMinutes()/100).toFixed(2).substr(2)+':'+(X.getSeconds()/100).toFixed(2).substr(2);
}
</script>
| Здесь последняя строчка +((m=X.getMinutes())<10?'0':'')+m+ заменена на +(X.getMinutes()/100).toFixed(2).substr(2)+ . | |
|
|
|
|