Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Время до события (Костик+)
Author Message
Костик+
Участник форума



Joined: 28 Jan 2008
Posts: 180
Карма: 4
   поощрить/наказать

Location: Луганск, Украина

PostPosted: Sun Mar 01, 2009 3:33 pm (написано за 2 минуты 35 секунд)
   Post subject: Время до события
Reply with quote

Доброго времени суток!
Столкнулся с проблемой. Хочу на сайте выводить время до часа Х. Использую следующий код:
Code (JavaScript): скопировать код в буфер обмена
<script type="text/javascript">
                var date_now = new Date();
                var date_end = new Date(data_end1 * 1000);
                var date = (date_end - date_now);
                var date_to_write = '';
               
                function getDataToEnd()
                {
                        date_to_write = (date.getYear().toString() + " " + date.getMonth().toString() + " " + date.getDate().toString() + " " + date.getHours().toString() + " " + date.getMinutes().toString() + " " + date.getSeconds().toString()); /*
                        document.getElementById('data_end').innerHTML = '<h1>' + date_to_write + '</h1>';
                }
               
                getDataToEnd();
        </script>
date_end1 - время в формате UNIX
Тестировал только в Опере. Она выдает ошибку Типы не совпадают. Как исправить данную ошибку?
Back to top
View user's profile Send private message Send e-mail
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Sun Mar 01, 2009 7:01 pm (спустя 3 часа 28 минут; написано за 1 минуту 37 секунд)
   Post subject:
Reply with quote

toString очевидно лишенне, так как JS преобразует к String если один из операндов строка. кроме того, getYear() устарело и надо пользоваться getFullYear()

но проблема по-моему в том, что операция - для объектов Date не определена
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Sun Mar 01, 2009 9:25 pm (спустя 2 часа 23 минуты; написано за 4 секунды)
   Post subject:
Reply with quote

Костик+, результат арифметических операций с переменными типа Date никак не будет того же типа. Даже из логических соображений
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Sun Mar 01, 2009 10:56 pm (спустя 1 час 30 минут; написано за 4 минуты 7 секунд)
   Post subject:
Reply with quote

Костик+, дам подсказку. Вычитать надо не даты, а их компоненты, как в вычитании в столбик. И аналогично вычитанию в столбик надо брать у более старшего разряда единицу. только система не 10-ная, а 60-60-24-(28,29,30,31)-12 ричная получится

п.с. может показаться, что куда проще перевести даты в тот же Unix Timestamp и найденную разницу перевести в года-месяцы-дни и т.д. Но так только кажется, потому что кол-во секунд разное не только в годе и месяце, но даже и в дне (как ни парадоксально, но вспомним летнее время).
Back to top
View user's profile Send private message
Denis Usenko
Участник форума



Joined: 06 Feb 2006
Posts: 54
Карма: 13
   поощрить/наказать


PostPosted: Mon Mar 02, 2009 6:09 am (спустя 7 часов 13 минут; написано за 27 секунд)
   Post subject:
Reply with quote

Rumata
+ new Date -- вернет миллисекунды с начала эпохи. Тоесть:
Code (JavaScript): скопировать код в буфер обмена
+ new Date == (new Date).getTime()
Соответственно:
Code (JavaScript): скопировать код в буфер обмена
date1 = new Date(timestamp1)
date2 = new Date(timestamp2)
difference = new Date(date2 - date2)
Костик+
У Вас во второй строке data_end1 не определена здесь. В третьей строке date должна быть датой:
Code (JavaScript): скопировать код в буфер обмена
    var date_now = new Date();
    var date_end = new Date(date_now * 1000); // data_end1 заменил на date_now
    var date = new Date(date_end - date_now); // date должна быть строкой
    var date_to_write = '';

    function getDataToEnd()
    {
            date_to_write = (
                date.getYear().toString() + " " +
                date.getMonth().toString() + " " +
                date.getDate().toString() + " " +
                date.getHours().toString() + " " +
                date.getMinutes().toString() + " " +
                date.getSeconds().toString()
            );

            alert(date_to_write)
    }
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Mon Mar 02, 2009 11:11 pm (спустя 17 часов 2 минуты; написано за 2 минуты 23 секунды)
   Post subject:
Reply with quote

Denis Usenko, попробуйте найти смысл в том что выведет такой код:
Code (JavaScript): скопировать код в буфер обмена
var date_now = new Date(2009, 3, 15); //
    var date_end = new Date(2009, 6, 15); //
    var date = new Date(date_end - date_now);
    var date_to_write = '';

    function getDataToEnd()
    {
            date_to_write = (
                date.getYear().toString() + " " +
                date.getMonth().toString() + " " +
                date.getDate().toString() + " " +
                date.getHours().toString() + " " +
                date.getMinutes().toString() + " " +
                date.getSeconds().toString()
            );

            alert(date_to_write) //
    }
я всегда думал, что между этими датами разница ровно в 3 месяца
Back to top
View user's profile Send private message
Denis Usenko
Участник форума



Joined: 06 Feb 2006
Posts: 54
Карма: 13
   поощрить/наказать


PostPosted: Tue Mar 03, 2009 4:41 am (спустя 5 часов 29 минут; написано за 1 минуту 15 секунд)
   Post subject:
Reply with quote

dimagolov
Если учесть что результат арифметических манипуляций над миллисекундами от начала эпохи ничего другого как миллисекунды от начала эпохи дать не может, то результат кажется мне абсолютно верным ))
Прибавьте к первому января 1970 года количество миллисекунд прошедших с 15 Апреля 2009 года по 15 Июля 2009 года, и Вы закономерно получите тот результат который выводит алерт.
Конечно это шутка, и Вы правы, что в данном случае надо действовать иначе. Но часто очень удобно считать в таком стиле:
(new Date(this.getTime() + (3 - (this.getDay() + 6) % 7) * 864e5)).getFullYear()
ЗЫ. Работа с датами, это таки да, опа то еще ))
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Tue Mar 03, 2009 3:15 pm (спустя 10 часов 34 минуты; написано за 3 минуты 55 секунд)
   Post subject:
Reply with quote

Denis Usenko, по-моему как правильно и почему неправильно так, как у автора, я указал во втором своем посте в данной теме. Зачем надо было плодить бессмысленный флейм? Мне-то даже понятно почему у меня получилось именно 20 часов :), но в Вашем примере с умножением миллисекунд на 1000 вычисления вообще теряют всякий смысл а результат связь с реальностью.
Back to top
View user's profile Send private message
Denis Usenko
Участник форума



Joined: 06 Feb 2006
Posts: 54
Карма: 13
   поощрить/наказать


PostPosted: Tue Mar 03, 2009 6:41 pm (спустя 3 часа 26 минут; написано за 10 секунд)
   Post subject:
Reply with quote

Бросте, Вы не ответили на вопрос автора темы:
Quote:
Тестировал только в Опере. Она выдает ошибку Типы не совпадают. Как исправить данную ошибку?
или ответили неверно:
Quote:
но проблема по-моему в том, что операция - для объектов Date не определена
оперция минус (-) определена для Number, и в контексте таких вычислений обращение к дате даст число. С точки зрения javascript это имеет совершенно определенный смысл.
Quote:
Мне-то даже понятно почему у меня получилось именно 20 часов :),
О как! Поздравляю.
Quote:
но в Вашем примере с умножением миллисекунд на 1000 вычисления вообще теряют всякий смысл а результат связь с реальностью.
1000 секунд -- это из кода топикстартера. Я не знаю что Вас так возмущает -- в предыдущем сообщении я объяснил почему выдается такой результат, и согласился с Вами относительно того как надо считать разницу в датах. И это не отменяет того факта что вычитание дат имеет место быть в программировании на javascript и имеет совершенно однозначный смысл -- это разница между этими датами в миллисекундах.
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Tue Mar 03, 2009 8:38 pm (спустя 1 час 56 минут; написано за 8 минут 37 секунд)
   Post subject:
Reply with quote

Меня возмущает ответ на бессмысленный вопрос. Код у ТС смысла не имеет и дать тот результат, которые ему нужен, не может принципиально. Поэтому Ваше занятие софистикой на тему моего ответа про операцию "-" абсолютно бессмысленно для всех, кроме видимо Вас. Более того, лично я только сейчас понял, что Ваш пост это указание мне на мою ошибку, и никак не относится к вопросу ТС "как посчитать время до события". Причем занялись Вы софистикой после того, как было рассказано как правильно решать стоящую перед ТС задачу.

п.с. Это не форум дурацких ответов на дурацкие вопросы. Это форум профессионалов.
п.п.с. А ошибки у меня нету. Для Date операция "-" как раз не определена, при ее выполнении Date приводится неявно к Number и над ним производится операция.
Back to top
View user's profile Send private message
Костик+
Участник форума



Joined: 28 Jan 2008
Posts: 180
Карма: 4
   поощрить/наказать

Location: Луганск, Украина

PostPosted: Fri Mar 06, 2009 11:11 pm (спустя 3 дня 2 часа 32 минуты; написано за 44 секунды)
   Post subject:
Reply with quote

Вопрос решил так:
Code (JavaScript): скопировать код в буфер обмена
                var date_now = new Date().getTime();
                var date_end = new Date(date_of_end_in_UNIX_style*1000).getTime();
                var date = new Date(date_end - date_now);
                var date_to_write = '';
                var perHours = 60*60*1000;
               
                function getDataToEnd()
                {
                        date_now = new Date().getTime();
                        date = new Date(date_end - date_now);
                        date_to_write = (Math.round(date/perHours) + ':' + date.getMinutes().toString() + ':' + date.getSeconds().toString());
                        alert(date_to_write);
                }
Вопрос решен, тему можно закрыть.
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Sat Mar 07, 2009 6:29 am (спустя 7 часов 18 минут)
   Post subject:
Reply with quote


М

Тема закрыта.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   This topic is locked: you cannot edit posts or make replies. All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML