Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> таймер, отсчёт времени, проблемы с летним время 
:(
    Опции темы
ressac
Дата 3.2.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: 1
Всего: 1



работает криво, например если выставить финальную дату до 30 Марта (включительно) то всё ОК, но как только ставлю 31 Марта или 1 Аперля то куда-то исчезает один Час....
и вот я думаю - это вероятно из за перехода на летнее время! и как быть теперь? smile ведь счётчик то в принципе правильно считает, но ещё в принципе не летнее время... 
тойсть хочу чтоб он отнимал тот самый час во время перехода , но ни как до него smile
Код

<html>
    <head>
    <title>
        r3554( Pr0du(t10n
    </title>
    <script language="JavaScript">

    one_day=1000*60*60*24;
    d1=new Date(2008,2,31);

    
    function timer()
    {
        d2=new Date();
        
        document.getElementById('week').innerHTML=
        Math.floor( (d1.getTime()-d2.getTime())/ (one_day*7));
        
        document.getElementById('days').innerHTML=
        Math.floor( (d1.getTime()-d2.getTime())/ one_day)%7;
        
        document.getElementById('hours').innerHTML=
        Math.floor( (d1.getTime()-d2.getTime())/ (one_day/24))%24;
        
        document.getElementById('min').innerHTML=
        Math.floor( (d1.getTime()-d2.getTime())/ (one_day/24/60))%60;
        
        document.getElementById('sec').innerHTML=
        Math.ceil( (d1.getTime()-d2.getTime())/ (one_day/24/60/60))%60;
        
        setTimeout("timer()",1000);
    }
    </script>

        <style type="text/css">
<!--
.tabClass {font-family: Verdana; font-size: 26px; height: 50%; width: 50%; text-align:center; color: #000000 }
.tdClass {color:#26ABAE; size: 30px}
-->
    </style>
</head>    
    <body onLoad="timer()">

    <table width="100%" height="100%" border="0"  >
  <tr>
    <td ><table border="0" class="tabClass" align="center">
        <tr>
          <td>semanas</td><td class="tdClass">[</td>
          <td><div id='week' style="color:#CC0000"></div></td><td class="tdClass">]</td>

          <td>.dias</td><td class="tdClass">[</td>
            <td><div id='days' style="color:#CC0000"></div></td><td class="tdClass">]</td>

          <td>.horas</td><td class="tdClass">[</td>
            <td><div id='hours' style="color:#CC0000"></div></td><td class="tdClass">]</td>

          <td>.minutas</td><td class="tdClass">[</td>
            <td><div id='min' style="color:#CC0000"></div></td><td class="tdClass">]</td>

          <td>.segundos</td><td class="tdClass">[</td>
            <td><div id='sec' style="color:#CC0000"></div></td><td class="tdClass">]</td>
        </tr>
</table>

</body>
</html>



Это сообщение отредактировал(а) ressac - 3.2.2008, 09:53
PM MAIL   Вверх
ressac
Дата 3.2.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: 1
Всего: 1



тут появилась идея добавить ещё год и месяц, только не выходит... помощь? smile
PM MAIL   Вверх
ressac
Дата 3.2.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: 1
Всего: 1



вот, написал smile

ещё раз прошу кого-то проверить алгоритм... плиз smile 

Код

<html>
    <head>
    <title>
        ressac
    </title>
    <script language="JavaScript">

    one_day=1000*60*60*24;
    d1=new Date(2008,3,1);
    n1=new Array(2);
    n2=new Array(2);

    function timer()
    {
        one=0;
        d2=new Date();
        d_act2=new Date(2008,(new Date()).getMonth(),(new Date()).getDate(),(new Date()).getHours());
        d_act1=new Date(2008,(new Date()).getMonth()+1,1);
        
        n2[0]=d2.getMonth()+1;
        n1[0]=d1.getMonth()+1;

        n2[1]=d2.getFullYear();
        n1[1]=d1.getFullYear();

        if( (n1[0]-=n2[0])<=0)
        {
            n1[0]+=12;
            one=1;
        }

        n1[1]-=(n2[1]+one);
        
        document.getElementById('year').innerHTML=n1[1];
        document.getElementById('month').innerHTML=n1[0]-1;


//*******************************************************        
        
        document.getElementById('week').innerHTML=
        Math.floor( (d_act1.getTime()-d_act2.getTime())/ (one_day)%31/7);
        
        document.getElementById('days').innerHTML=
        Math.floor( (d_act1.getTime()-d_act2.getTime())/ one_day)%7;

        
//*******************************************************        
        
        document.getElementById('hours').innerHTML=
        Math.floor( (d1.getTime()-d2.getTime())/ (one_day/24))%24;
        
        document.getElementById('min').innerHTML=
        Math.floor( (d1.getTime()-d2.getTime())/ (one_day/24/60))%60;
        
        document.getElementById('sec').innerHTML=
        Math.ceil( (d1.getTime()-d2.getTime())/ (one_day/24/60/60))%60;
        
//*******************************************************        

        setTimeout("timer()",1000);
    }
    </script>

        <style type="text/css">
<!--
.tabClass {font-family: Verdana; font-size: 26px; height: 50%; width: 50%; text-align:center; color: #000000}
.tdClass {color:#26ABAE; size: 30px}
-->
    </style>
</head>    
    <body onLoad="timer()">

    <table width="100%" height="100%" border="0"  >
  <tr>
    <td ><table border="0" class="tabClass" align="center">
        <tr>
           <td>años</td><td class="tdClass">[</td>
           <td><div id='year' style="color:#CC0000"></div></td><td class="tdClass">]</td>
           
          <td>.meses</td><td class="tdClass">[</td>
           <td><div id='month' style="color:#CC0000"></div></td><td class="tdClass">]</td>
        
          <td>.semanas</td><td class="tdClass">[</td>
           <td><div id='week' style="color:#CC0000"></div></td><td class="tdClass">]</td>
 
          <td>.dias</td><td class="tdClass">[</td>
            <td><div id='days' style="color:#CC0000"></div></td><td class="tdClass">]</td>

          <td>.horas</td><td class="tdClass">[</td>
            <td><div id='hours' style="color:#CC0000"></div></td><td class="tdClass">]</td>

          <td>.minutas</td><td class="tdClass">[</td>
            <td><div id='min' style="color:#CC0000"></div></td><td class="tdClass">]</td>

          <td>.segundos</td><td class="tdClass">[</td>
            <td><div id='sec' style="color:#CC0000"></div></td><td class="tdClass">]</td>
        </tr>
</table>

</body>
</html>


PM MAIL   Вверх
SelenIT
Дата 3.2.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Цитата(ressac @  3.2.2008,  09:51 Найти цитируемый пост)
хочу чтоб он отнимал тот самый час во время перехода , но ни как до него

Не совсем понял формулировку задачи). Но как вариант - использовать методы getUTCЧто-то вместо просто getЧто-то.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
ksnk
Дата 3.2.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Работает, неправильно... Код утверждает, что между 2008/1/3 21:18:00 и 2008/3/1 0:0:0
пройдет ... 1 час ... в то время как пройдет ... 2 ... ;) Видите ли, день перевода времени - это такой странный день, типа февраля, в нем 23 или 25 часов вместо 24-x. и работать с ним нужно столь-же загадочно как и с месяцами...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ressac
Дата 3.2.2008, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: 1
Всего: 1



ksnk, да, я об этом выше говорил,
так выходит из-за перехода не летнее время.

на самом деле показывает он точно, просто в момент перехода (30 марта) он два часа повторит,
попробуй выставить у себя 30 марта
PM MAIL   Вверх
ksnk
Дата 3.2.2008, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Ну что-ж тогда вот - правильный вариант 
Код

    function daydiff(date,date2){
        var needed={
             sec:'Seconds'
            ,min:'Minutes'
            ,hours:'Hours'
            ,days:'Date'
            ,month:'Month'
            ,year:'Year'
            ,week:0
        }

        function one_sel(d1,d2,val,sel){
            var get='get'+val,
                set='set'+val,
                _1=d1[get](),
                _2=d2[get]();
            if(_1<_2){
                d1[set](-1);
                _1+=d1[get]()+1;
            }
            return _1-_2;
        }
        
        window.daydiff=function (date,date2){
            var ret={}
            var d1=new Date(),
                d2=(date2 instanceof Date)?date2:new Date(date2);
            d1.setTime(date.getTime());    
            if(d1<d2) return null;
            for (var i in needed){
                if(i=='week'){
                    var t=ret.days;
                    ret.days=ret.days%7;
                    ret[i]=Math.floor(t/7);
                } else 
                    ret[i]=one_sel(d1,d2,needed[i]);
            }
            return ret;
        }
        return window.daydiff(date,date2)
    }
    
    function timer(date)
    {
        function _Timer(){
            var diff=daydiff(date,new Date());
            for (var i in diff){
                document.getElementById(i).innerHTML=diff[i]
            }
        }
        setInterval(_Timer,1000);
    }


Ну и вставлять его в код
Код

    <body onLoad="timer(new Date(2008,2,31))">

Кстати - перевод времени будет с 29 марта по 30...

Добавлено через 1 минуту и 37 секунд
Между 5 часов 29 марта и 6 часов 30 марта пройдет 1 день и 1 час smile

Добавлено через 4 минуты и 30 секунд
Хотя в день перевода дат я тоже заглючу... :(


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SelenIT
Дата 3.2.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Цитата(ksnk @  3.2.2008,  22:01 Найти цитируемый пост)
день перевода дат

Сорри, а это когда?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
ksnk
Дата 3.2.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



SelenIT,  Oops! Стормозил. Это день перевода часов на летнее время... smile


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ressac
Дата 4.2.2008, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: 1
Всего: 1



ksnk, не понял ни принцип кода ни ход работы, у меня было на часах 22:00 , твой код вывел на экран "3" и всё ...

вот тут финальная версия smile надеюсь что финальная

ressac.110mb.com


единственный "ГЛЮК" это то что до перехода на летнее время день кончается на ЧАС раньше, так что как это решить [B]вопрос остаётся открытым smile[/B]

Это сообщение отредактировал(а) ressac - 4.2.2008, 00:11
PM MAIL   Вверх
ksnk
Дата 4.2.2008, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(ressac @  4.2.2008,  00:10 Найти цитируемый пост)
у меня было на часах 22:00 , твой код вывел на экран "3" и всё ...

А здесь? Там еще табличка для проверки разности между датами... 6 строк таблицы вставляются в Date(1,2,3,4,5,6)...
Кстати, наши таймеры отличаются на час... ;-)

Добавлено @ 01:06
В добавок он не глючит при переходе на летнее время. Просто я проверял разницу между 2008/3/30:1 ночи, а время переводят с часа сразу на 2...

Это сообщение отредактировал(а) ksnk - 4.2.2008, 01:07


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 4.2.2008, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(ressac @  4.2.2008,  00:10 Найти цитируемый пост)
не понял ни принцип кода ни ход работы
 Принцип
функция daydiff: получает даты  d1 и d2.
Для каждой из них последовательно применяем функции getSeconds, getMinutes,... getYear
получаем на каждой итерации число _1 и _2. Если _1 меньше, чем _2, добавляем к _1 (d1.setXXX(-1)).getXXX()+1. В результате этой магии получаем 59+1 для секунд/минут и 29 дней для февраля этого года. В добавок этой-же магией автоматически учитываются "заемные" значение, к примеру разница 10:0 и 9:59 выдаст 0 и 59 секунд, после магии первая дата станет 9:59. Результат - 1 секунда...  На каждой итерации в результирующий объект сваливаем то, что получилось под соответствующим именем.

функция timer использует daydiff для размещения результатов ее работы в нужном месте.

Остальная магия служит для связки слов в предложении и для излишней оптимизации  smile

Добавлено через 2 минуты и 46 секунд
Кстати, если прислушаться к совету SelenIT, и указать "начальную" дату в GMT формате, то пользователи в Америке не будут удивлены странной датой начала мероприятия... ;-)


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ressac
Дата 4.2.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: 1
Всего: 1



Цитата(ksnk @  3.2.2008,  22:57 Найти цитируемый пост)
А здесь? Там еще табличка для проверки разности между датами

да тут видно всё хорошо smile

НО у тебя почему-то на один ДЕНЬ больше выходит, не считай тот день в котором Мы находимся сейчас. так как он ведь уже не полный ДЕНЬ...
плюс не понятки у тебя с вводом данных, тот что внизу показывает точно , а тот что в верху - не точно, например я выставил 30 марта и  он показал 0 дней.

Цитата(ksnk @  3.2.2008,  22:57 Найти цитируемый пост)
В добавок он не глючит при переходе на летнее время. Просто я проверял разницу между 2008/3/30:1 ночи, а время переводят с часа сразу на 2...


у меня разве глючит? у меня просто два раза один час прокручивает...

PM MAIL   Вверх
ksnk
Дата 4.2.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Не понял ;)
вот тестовый замер
Код

Sun, 30 Mar 2008 00:00:00 GMT+0300
Thu, 03 Jan 2008 23:00:00 GMT+0300
sec:0 min:0 hours:1 days:5 month:2 year:0 week:3

к нижней дате прибавляем
+2 месяца = 03 марта
+3 + 3 недели*7 +5 дней=29 марта 
 + 1 час = 30 марта...
Где-то что-то неправильно считается?
Или на других датах чего-то неправильное?
Проще делать такие слепки Оперой, она позволяет из окна alert'а копировать...

Добавлено через 2 минуты и 5 секунд
Цитата(ressac @  4.2.2008,  19:30 Найти цитируемый пост)
плюс не понятки у тебя с вводом данных, тот что внизу показывает точно , а тот что в верху - не точно, например я выставил 30 марта и  он показал 0 дней.

Это непонятки, чего вводилось в каждое поле?

Добавлено через 4 минуты и 34 секунды
Цитата(ressac @  4.2.2008,  19:30 Найти цитируемый пост)
не считай тот день в котором Мы находимся сейчас. так как он ведь уже не полный ДЕНЬ...

Это как это, между 23:00 сегодня и 23:00 завтра пройдет 0 дней? smile


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ressac
Дата 4.2.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: 1
Всего: 1



Цитата(ksnk @  4.2.2008,  18:38 Найти цитируемый пост)
Это непонятки, чего вводилось в каждое поле?


30 марта 17:00 , и на локальных часах у себя туже дату ставил и был разный результат.


Цитата(ksnk @  4.2.2008,  18:38 Найти цитируемый пост)

Это как это, между 23:00 сегодня и 23:00 завтра пройдет 0 дней? smile 


нет пройдёт 1 день, но если 23:01 сегодня и завтра 23:00 то пройдёт уже 0 дней и 23:59 часа  smile))
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1406 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.