@zkrvndm
Софт для автоматизации

Как создать свой вариант конструктора Date?

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

Подскажите, можно ли как-то создать свой экземпляр new Date() который отставал бы на 3 секунды допустим? Хотя я не совсем верно выразился - хочу изменить new Date() или его прототип, чтобы он возвращал время уже с моими корректировками, чтобы бац и все функции на сайте начали сразу получать правильное серверное время.

Но в принципе можно и не менять оригинал, меня устроит если бы можно было как-то создать измененную копию new Date() и записать его куда нибудь в переменную, а я дальше вместо new Date() просто обращался бы к этой переменной.

Буду признателен за советы и даже просто за наводку, что именно мне искать в Google / Яндекс.
  • Вопрос задан
  • 261 просмотр
Решения вопроса 2
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
Знатно накосячил из-за невнимательности.
тоже верные варианты))

Тут такое дело, встроеная Date не является классом как таковым, поэтому все неверные варианты убрал под спойлер

Был не прав, варианты рабочие)))
class ServerDate extends Date {
    construcror(...args) {
        super(...args);
        if (args.length === 0) {
            // если аргументов конструктора нет то получаем время от сервера
            fetch("url роутера на сервере отдающего время в миллисекундах")
                .then((response) => {
                    return response.json();
                })
                .then((data) => {
                    this.setTime(data.time)
                })

        }
    }
}

const date = new ServerDate();


!!!!! возможно будет ругаться на super(...args);. Если да, то можно попробовать сделать так
class ServerDate extends Date {
    construcror(...args) {
        // super(...args);
        if (args.length) {
            this.setTime(Date.now());

        }else{
            // если аргументов конструктора нет то получаем время от сервера
            fetch("url роутера на сервере отдающего время в миллисекундах")
                .then((response) => {
                    return response.json();
                })
                .then((data) => {
                    this.setTime(data.time)
                })            
        }
    }
}

const date = new ServerDate();

console.log(date)




Верный вариант мы с вами сейчас сделаем в комментариях.

Но сразу предупреждаю, это откровенный костыль, не делайте так)))
!!!!! Кроме того, такие функции как Date.now() и ей подобные по прежнему будут работать со временем клиента
!!!!! А так же до тех пор пока идет запрос к серверу, дата полученная этим способом const date = new ServerDate(); будет содержать время клиента
Ответ написан
KorniloFF
@KorniloFF Куратор тега JavaScript
Работаю по font-end / JS
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы