Une vie en quelques lignes
22 DEC 1984 · BORN
Le 22 décembre 1984 est ma date de naissance. C’est le point de départ du nombre de jours vécus.
30 JUL 2022 · DUBAI
Le 30 juillet 2022 marque le début de ma vie à Dubaï. Cette partie de ma vie a son propre compteur.
NOW
La date du jour à l’heure de Dubaï, UTC+4. Elle change au fil du calendrier.
LIFE · DAY
Le nombre de jours calendaires complets depuis la naissance. Le jour de la naissance est le point de départ, le jour zéro.
DUBAI · DAY
Le nombre de jours écoulés depuis mon installation à Dubaï.
OF LIFE · DUBAI
Les jours passés à Dubaï divisés par tous les jours vécus. Le déménagement prend ainsi sa place à l’échelle d’une vie entière.
Le code derrière ces chiffres
Cette fonction compte les jours vécus, les jours à Dubaï et leur part dans une vie. Elle alimente aussi le compteur ci-dessus. Copiez cet exemple fonctionnel sur votre page et remplacez les deux dates par les vôtres. Les jours calendaires suivent l’heure de Dubaï.
<output id="life-counter" aria-label="Code du compteur"></output>
<script>
const lifeCounters = function lifeCounters(now, residency, birth, locale, units) {
const parts = Object.fromEntries(new Intl.DateTimeFormat("en-CA", {
timeZone: "Asia/Dubai",
year: "numeric",
month: "2-digit",
day: "2-digit"
}).formatToParts(now).map((p) => [p.type, p.value]));
const day = Date.UTC(+parts.year, +parts.month - 1, +parts.day);
const count = (date) => {
if (!/^\d{4}-\d{2}-\d{2}$/.test(date || "")) throw new Error("Invalid counter date");
return Math.floor((day - Date.parse(date + "T00:00:00Z")) / 864e5);
};
const dubai = count(residency), life = count(birth);
if (!Number.isFinite(dubai) || !Number.isFinite(life) || dubai < 0 || life <= 0) throw new Error("Invalid counter range");
const unit = (n) => units[new Intl.PluralRules(locale).select(n)] || units.other;
const d = Object.fromEntries(new Intl.DateTimeFormat(locale, {
timeZone: "Asia/Dubai",
year: "numeric",
month: "long",
day: "numeric"
}).formatToParts(now).map((p) => [p.type, p.value]));
return {
"data-current-date": ["ru", "en"].includes(locale.split("-")[0]) ? `${d.day} ${d.month} ${d.year}` : new Intl.DateTimeFormat(locale, {
timeZone: "Asia/Dubai",
dateStyle: "long"
}).format(now),
"data-dubai-day-counter": dubai.toLocaleString(locale),
"data-life-day-counter": life.toLocaleString(locale),
"data-dubai-day-unit": unit(dubai),
"data-life-day-unit": unit(life),
"data-dubai-life-share": (dubai / life * 100).toLocaleString(locale, {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}) + "%"
};
};
function updateCounter() {
const counters = lifeCounters(
new Date(), '2022-07-30', '1984-12-22', 'en-US', {other: 'days'}
);
document.getElementById('life-counter').textContent = [
'LIFE · DAY ' + counters['data-life-day-counter'],
'DUBAI · DAY ' + counters['data-dubai-day-counter'],
counters['data-dubai-life-share'] + ' OF LIFE · DUBAI'
].join(' / ');
}
updateCounter();
setInterval(updateCounter, 30000);
</script>
@nevsky_alexander
Sur Instagram, Dubaï au-delà de la carte postale : la famille, la ville, les trouvailles et la vie entre deux projets. Sur Threads, des réflexions à voix haute sur le design et l’IA. Sur YouTube, des vidéos qui ont besoin de plus de place qu’une story. Retrouvez-moi là où vous vous sentez bien, et gardons le contact