|
|
@@ -378,43 +378,43 @@
|
|
|
}
|
|
|
|
|
|
function startCountdown() {
|
|
|
- const targetHour = 20; // 20:00 (8h tối)
|
|
|
- const now = new Date();
|
|
|
- let target = new Date();
|
|
|
- target.setHours(targetHour, 0, 0, 0);
|
|
|
-
|
|
|
- if (now >= target) {
|
|
|
- target.setDate(target.getDate() + 1);
|
|
|
- }
|
|
|
-
|
|
|
- // Äịnh dạng ngà y hiển thị (VD: Friday, Mar 20, 2026)
|
|
|
- const options = { weekday: 'long', month: 'short', day: 'numeric', year: 'numeric' };
|
|
|
- const dateText = target.toLocaleDateString('en-US', options);
|
|
|
- document.getElementById('draw-date').innerText = dateText;
|
|
|
+ const targetHour = 20; // 20:00 (8 PM) Haiti time
|
|
|
+ const timeZone = 'America/Port-au-Prince';
|
|
|
+ const timers = document.querySelectorAll('.countdown-timer');
|
|
|
+
|
|
|
+ // Server time string has no offset => must be interpreted in Haiti timezone
|
|
|
+ const serverTimeStr = '@Model.serverTime.ToString("yyyy-MM-ddTHH:mm:ss")';
|
|
|
+ const startBrowser = moment();
|
|
|
+ const baseServer = moment.tz(serverTimeStr, 'YYYY-MM-DDTHH:mm:ss', timeZone);
|
|
|
|
|
|
function updateTime() {
|
|
|
- const current = new Date();
|
|
|
- const diff = target - current;
|
|
|
-
|
|
|
- if (diff <= 0) {
|
|
|
- target.setDate(target.getDate() + 1);
|
|
|
- const updatedDateText = target.toLocaleDateString('en-US', options);
|
|
|
- document.getElementById('draw-date').innerText = updatedDateText;
|
|
|
- updateTime();
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- const hours = Math.floor((diff / (1000 * 60 * 60)));
|
|
|
- const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
|
|
|
- const seconds = Math.floor((diff % (1000 * 60)) / 1000);
|
|
|
-
|
|
|
- document.getElementById('countdown-hours').innerText = hours.toString().padStart(2, '0');
|
|
|
- document.getElementById('countdown-minutes').innerText = minutes.toString().padStart(2, '0');
|
|
|
- document.getElementById('countdown-seconds').innerText = seconds.toString().padStart(2, '0');
|
|
|
+ const elapsedMs = moment().diff(startBrowser);
|
|
|
+ const now = baseServer.clone().add(elapsedMs, 'milliseconds'); // Haiti time
|
|
|
+
|
|
|
+ let target = now.clone().hour(targetHour).minute(0).second(0).millisecond(0);
|
|
|
+ if (now.isSameOrAfter(target)) target.add(1, 'day');
|
|
|
+
|
|
|
+ // Draw date display (e.g. Friday, Mar 20, 2026) in Haiti time
|
|
|
+ const dateText = target.clone().locale('en').format('dddd, MMM D, YYYY');
|
|
|
+ const drawDateEl = document.getElementById('draw-date');
|
|
|
+ if (drawDateEl) drawDateEl.innerText = dateText;
|
|
|
+
|
|
|
+ const dur = moment.duration(target.diff(now));
|
|
|
+ const hours = Math.max(0, Math.floor(dur.asHours()));
|
|
|
+ const minutes = Math.max(0, dur.minutes());
|
|
|
+ const seconds = Math.max(0, dur.seconds());
|
|
|
+
|
|
|
+ const hhEl = document.getElementById('countdown-hours');
|
|
|
+ const mmEl = document.getElementById('countdown-minutes');
|
|
|
+ const ssEl = document.getElementById('countdown-seconds');
|
|
|
+
|
|
|
+ if (hhEl) hhEl.innerText = hours.toString().padStart(2, '0');
|
|
|
+ if (mmEl) mmEl.innerText = minutes.toString().padStart(2, '0');
|
|
|
+ if (ssEl) ssEl.innerText = seconds.toString().padStart(2, '0');
|
|
|
|
|
|
// Update all card timers
|
|
|
const timeStr = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
|
|
|
- document.querySelectorAll('.countdown-timer').forEach(t => t.innerText = timeStr);
|
|
|
+ timers.forEach(t => t.innerText = timeStr);
|
|
|
}
|
|
|
|
|
|
updateTime();
|