ошибка с использованием локального преобразования времени в функции времени JavaScript - PullRequest
0 голосов
/ 15 августа 2010
<script type="text/javascript">
//Live Javascript Server Time
function getthedate(city, offset){
    // create Date object for current location
    d = new Date();

    // convert to msec
    // add local time zone offset 
    // get UTC time in msec
    utc = d.getTime() + (d.getTimezoneOffset() * 60000);

    // create new Date object for different city
    // using supplied offset
    nd = new Date(utc + (3600000*offset));


    var hours = nd.getHours()
    var minutes = nd.getMinutes()
    var seconds = nd.getSeconds()
    var dn="AM"
        if (hours>=12)
        dn="PM"
        if (hours>12){
        hours=hours-12
        hours="0"+hours
        }
        if (hours==0)
        hours=12
        if (minutes<=9)
        minutes="0"+minutes
        if (seconds<=9)
        seconds="0"+seconds

    var cdate="<strong><font color='b9b9b9' size='1'> "+hours+":"+minutes+":"+seconds+" "+dn+"</font></strong>"
    if (document.all)
    document.all.clock.innerHTML=cdate
    else if (document.getElementById)
    document.getElementById("clock").innerHTML=cdate
    else
    document.write(cdate)
    }
if (!document.all&&!document.getElementById)
getthedate()
function live_servertime(){
if (document.all||document.getElementById)
setInterval("getthedate()",1000)
 }
 // get London time
alert(getthedate('London', '+1'));   </script>

Эй. Я хотел отобразить текущее время сервера (если я знаю его часовой пояс / смещение utc), используя этот хак в простом браузерном скрипте реального времени: Ссылка для взлома JavaScript

Однако, используя мой код выше, все, что отображается: NaN: NaN: Nan AM Кто-нибудь знает, как заставить это работать?

1 Ответ

0 голосов
/ 15 августа 2010

Я не получаю NaN:NaN:Nan AM или что-то в этом роде, мне кажется, это просто работает.

Но в вашем коде есть некоторые недостатки. Во-первых, всегда объявляйте свои переменные локально, используя var. Теперь вы молча перезаписываете d, utc и nd в глобальном пространстве имен.

Во-вторых, это, скорее всего, не то, что вы хотите:

if (hours>12){
    hours=hours-12
    hours="0"+hours
}

Вы не хотите, чтобы 0 был добавлен до часа, если это между 22:00 и полночью. Кроме того, 0 не добавляется до 10 часов утра.

Возможно, вы хотите проверить это за пределами условие hours>12:

if (hours<=9)
    hours="0"+hours;

Кроме того, вы делаете

if (document.all)
document.all.clock.innerHTML=cdate

document.all - очень старый, вам больше не нужно его использовать! Даже IE 6 понимает стандарт document.getElementById.

setInterval("getthedate()",1000)

Всегда старайтесь использовать setInterval и setTimeout функцию вместо строки. Цитировать MDC :

Использование этого синтаксиса не рекомендуется по тем же причинам, что и использование eval ()

И, наконец, что не менее важно, используйте правильный отступ и ставьте точку с запятой после каждого утверждения; процитировать Дуглас Крокфорд :

JavaScript использует C-подобный синтаксис, который требует использования точек с запятой Разграничить заявления. JavaScript попытки сделать точки с запятой необязательными с механизмом вставки точек с запятой. Это опасно.

Как и C, JavaScript имеет ++ и -- и ( операторов, которые могут быть префиксы или суффиксы. устранение неоднозначности сделано точка с запятой.

В JavaScript перевод строки может быть пробел или он может действовать как точка с запятой. Это заменяет одну двусмысленность с другим.

JSLint ожидает, что каждое утверждение будет затем ;, за исключением for, function, if, switch, try и while. JSLint не ожидает увидеть ненужные точки с запятой или пустые заявление.

Трудно следовать вашему коду так, как вы его написали; например, я поймал себя в ловушку, думая, что ваше состояние (hours>12) было в пределах состояния AM / PM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...