Кастомные даты и время

Хотелось сделать рп бота для дискорда с кастомным временем и датами. Время должно идти в 2 раза быстрее обычного. Как это можно сделать? Хотелось бы ещё кастомные даты.


Ответы (2 шт):

Автор решения: nörbörnën

const el = document.getElementById('root');
let customTimestamp = new Date('2021-07-01 00:00:00').getTime();
const customRate = 2;

setInterval(
  () => {
    customTimestamp += 1000;
    el.innerHTML = new Date(customTimestamp);
  },
  1000 / customRate
);
<div id="root"></div>

→ Ссылка
Автор решения: yar85

Пример фабрики объектов работающих как стандартный Date - но с доп. параметром при создании (передается последним аргументом), который задает множитель скорости:

function MyDate(...args) {
  const multiplier = args.pop() || 1,
        start = new Date(...args);
  Object.assign(start, { multiplier });
  return new Proxy(start, {
    get(obj, prop) {
      if (typeof obj[prop] === 'function') {
        if (/^set/.test(prop)) return obj[prop].bind(obj);
        const diff = new Date() - start,
              mul = Math.max(0.001, +obj.multiplier || 1),
              buf = new Date(+start + diff * mul);
        return buf[prop].bind(buf);
      }
      return obj[prop];
    },
  });
}

const x2date = MyDate(2),                     // удвоенная скорость течения времени
      x60date = MyDate(60),                   // минуты за секунды
      x05fromMar10 = MyDate(2010, 2, 1, 0.5); // замедленное вдвое время с 1 марта 2010
const loop = () => {
  document.body.innerHTML = `
    <p><b>x2:</b> ${x2date.toLocaleString()}</p>
    <p><b>x60:</b> ${x60date.toLocaleString()}</p>
    <p><b>x0,5 с 1 марта 2010:</b> ${x05fromMar10.toLocaleString()}</p>
  `;
  requestAnimationFrame(loop);
};
loop();

Вероятно, тут не учтены какие-то нюансы помимо разной обработки вызова сеттеров компонентов даты (которые я даже не проверял, кстати) и остальных методов - но тут самая суть подхода к реализации, надеюсь что она понятна.

→ Ссылка