Aller au contenu

Une vie en quelques lignes

22 DEC 1984 · BORN30 JUL 2022 · DUBAI04 NOV 2026 · NOWLIFE · DAY 15,292DUBAI · DAY 1,55810.19% OF LIFE · DUBAI

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.

Voir tous les jours

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ï.

HTML + JavaScript
<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

Abonnement 1 Abonnement 2 Abonnement 3
Abonnement 4 Abonnement 5 Abonnement 6
Rendez-vous de 15 minutes
Ouvrir dans Cal.com ↗