Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 15

Обратный отсчёт

27.03.2020, 08:55. Показов 1559. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дорогие форумчане! Я(новичок в этой сфере) написал программку для вывода оставшегося времени (таймер), но мне нужно сделать так, чтобы промежуток который показывает этот таймер был во всех часовых поясах одинаковым и нигде не отличался. В чем проблема: мероприятие начинается в 12.00 по мск, если я задам время 12.00, то для людей из владивостока с разницей времени в 8 часов это время будет неактуальным, у них таймер будет нулевым, как можно эту проблему решить?


HTML5
1
2
<h2 align="center" id="nameid">До выхода осталось: </h2>
 <h2 align="center" id="timer"></h2>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
      
    <script>
     
// Создаём переменную, которая будет хранить элемент для вывод таймера
let timer_show = document.getElementById("timer");
 
// Это функция для вычитания времени
function diffSubtract(date1, date2) {
    return date2 - date1;
}
 
// Это JSON массив с данными о времени
let end_date = {
    "full_year": "2020", // Год
    "month": "03", // Месяц
    "day": "27", // День
    "hours": "12", // Час
    "minutes": "49", // Минуты
    "seconds": "00" // Секунды
}
 
// Переменная строка, которая хранит время до которого нужно досчитать
let end_date_str = `${end_date.full_year}-${end_date.month}-${end_date.day}T${end_date.hours}:${end_date.minutes}:${end_date.seconds}`;
  
      // Создаём интервал
timer = setInterval(function () {
    // Берём настоящие время
    let now = new Date();
    // Берём наше время, до которого надо сделать отсчёт
    let date = new Date(end_date_str);
    // Создаём переменную в которой будет хранится разность времени
    let ms_left = diffSubtract(now, date);
    // Если разность меньше или равна нулю
    if (ms_left <= 0) {
        // То выключаем интервал
        clearInterval(timer);
        // И выводим сообщение что "Время закончилось"
     document.getElementById("nameid").innerHTML="Я - текст, я появился!";
    } else { // Иначе
        // Получаем время с его разностью
        let res = new Date(ms_left);
        // Делаем строку для вывода значений таймера
      let str_timer = ` ${res.getUTCDate() - 1} дней ${res.getUTCHours()} часов ${res.getUTCMinutes()}минут ${res.getUTCSeconds()} секунд`;
        // Выводим таймер
        timer_show.innerHTML = str_timer;
    }
}, 1000)
      
      </script>
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2020, 08:55
Ответы с готовыми решениями:

Обратный отсчет
Сначала число уменьшается на единицу, а потом на большую величину. Подскажите, в чем может быть проблема. &lt;!DOCTYPE html&gt; ...

Время. Обратный отсчет
Здравствуйте. Есть код &lt;SCRIPT LANGUAGE=\&quot;JavaScript\&quot; TYPE=\&quot;text/javascript\&quot;&gt; var t_m1 = $left_min; var t_s1 = $left_sec; ...

Обратный отсчёт времени от реального
Как по нажатию кнопки или сразу при загрузки сайта на экране пользователя прошло время в обратном порядке, т.е. , например, при загрузке...

1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
27.03.2020, 11:13
Лучший ответ Сообщение было отмечено AndranikTomskiy как решение

Решение

Здравствуйте, уважаемый.

На основе миллионов таймеров обратных отсчетов выкристаллировался некий вменяемый и гибкий вариант:
index.html
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <h2 id="nameid">До выхода осталось:</h2>
    <div class="timer">
        <span class="day"></span> дн. <span class="hour"></span>:<span class="min"></span>:<span class="sec"></span>
    </div>
     <script src="scripts/app.js"></script>
</body>
</html>
scripts/app.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Timer {
    constructor(newDate, currentCallback, endCallback, element) {
        this.intervalId = setInterval(Timer.timer, 1000, newDate, currentCallback, endCallback, element, this.intervalId);
        Timer.timer(newDate, currentCallback, endCallback, element, this.intervalId);
    }
    static timer(newDate, currentCallback, endCallback, element, intervalId) {
        let now = Date.now(), rest = newDate >= now ? Math.round((newDate - now) / 1000) * 1000 : 0;
        if (!rest) {
            clearInterval(intervalId);
            if (currentCallback) currentCallback(0, 0, 0, 0, element);
            if (endCallback) endCallback(element);
            return;
        }
        let dd = Math.floor(rest / 86400000);
        rest -= dd * 86400000;
        let hh = Math.floor(rest / 3600000);
        rest -= hh * 3600000;
        let mm = Math.floor(rest / 60000);
        rest -= mm * 60000;
        let ss = Math.floor(rest / 1000);
        if (currentCallback)
            currentCallback(dd, hh, mm, ss, element);
    }
}
 
let element = document.querySelector(".timer");
let date = new Date("2020-03-27T09:57:00+03:00");
new Timer(date, showTime, showEnd);
 
function showTime(dd, hh, mm, ss) {
    element.querySelector(".day").textContent = (dd < 10 ? "0" : "") + dd;
    element.querySelector(".hour").textContent = (hh < 10 ? "0" : "") + hh;
    element.querySelector(".min").textContent = (mm < 10 ? "0" : "") + mm;
    element.querySelector(".sec").textContent = (ss < 10 ? "0" : "") + ss;
}
 
function showEnd() {
    element.style.display = "none";
    document.getElementById("nameid").innerHTML = "Я - текст, я появился!";
}
Исходный TypeScript-файл:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Timer {
    intervalId: number;
    constructor(newDate: Date, currentCallback?: Function, endCallback?: Function, element?: any) {
        this.intervalId = setInterval(Timer.timer, 1000, newDate, currentCallback, endCallback, element, this.intervalId);
        Timer.timer(newDate, currentCallback, endCallback, element, this.intervalId);
    }
 
    static timer(newDate: Date, currentCallback: Function, endCallback: Function, element: HTMLElement, intervalId: number) {
        let now = Date.now(),
            rest = <any>newDate >= now ? Math.round((<any>newDate - now) / 1000) * 1000 : 0;
        if (!rest) {
            clearInterval(intervalId);
            if (currentCallback) currentCallback(0, 0, 0, 0, element);
            if (endCallback) endCallback(element);
            return;
        }
        let dd = Math.floor(rest / 86400000);
        rest -= dd * 86400000;
        let hh = Math.floor(rest / 3600000);
        rest -= hh * 3600000;
        let mm = Math.floor(rest / 60000);
        rest -= mm * 60000;
        let ss = Math.floor(rest / 1000);
 
        if (currentCallback) currentCallback(dd, hh, mm, ss, element);
    }
}
 
let element = <HTMLDivElement>document.querySelector(".timer");
let date = new Date("2020-03-27T09:57:00+03:00");
new Timer(date, showTime, showEnd);
 
function showTime(dd: number, hh: number, mm: number, ss: number) {
    element.querySelector(".day").textContent = (dd < 10 ? "0" : "") + dd;
    element.querySelector(".hour").textContent = (hh < 10 ? "0" : "") + hh;
    element.querySelector(".min").textContent = (mm < 10 ? "0" : "") + mm;
    element.querySelector(".sec").textContent = (ss < 10 ? "0" : "") + ss;
}
 
function showEnd() {
    element.style.display = "none";
    document.getElementById("nameid").innerHTML = "Я - текст, я появился!";
}

Просили раскрашивать разные цифры в разные цвета. Легко.
Просили чего-нибудь сделать по окончании таймера. Легко.
Просили несколько таймеров на странице. Легко.

-----
Чтобы страница открылась во Владивостоке, эту строчку должен захардкодить сервер:
JavaScript
1
let date = new Date("2020-03-27T09:57:00+03:00");
Добавлено через 1 минуту
Добавил необязательность двух коллбэков.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.03.2020, 11:13
Помогаю со студенческими работами здесь

Как сделать нестандартный обратный отсчёт?
Приветствую, уважаемые формучане! Помогите, пожалуйста, разобраться со следующей задачей. Имеется файл .html, в котором есть блок...

Как сделать что бы при обновлении страницы обратный отсчет не сбрасывался а продолжался?
Всем доброго времени суток. Подскажите как сделать что бы при обновлении страницы обратный отсчет не сбрасывался а продолжался ...

После потери фокуса сделайте так, чтобы в абзаце ниже начал тикать обратный отсчет, начиная с введенного числа.
Дан инпут. В него вводится число. По потери фокуса сделайте так, чтобы в абзаце ниже начал тикать обратный отсчет, начиная с введенного...

Отсчет времени
Проблема примерно такая. Есть некая функция, которая делает вычисления. Время ее выполнения всегда разное. Варьируется от 300 до 1700...

Отсчет дней до даты рождения
&lt;!DOCTYPE html&gt; &lt;html lang=&quot;en&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;UTF-8&quot;&gt; &lt;title&gt;Document&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;button...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru