Кастомные даты и время
Хотелось сделать рп бота для дискорда с кастомным временем и датами. Время должно идти в 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();
Вероятно, тут не учтены какие-то нюансы помимо разной обработки вызова сеттеров компонентов даты (которые я даже не проверял, кстати) и остальных методов - но тут самая суть подхода к реализации, надеюсь что она понятна.