Grazie per la risposta, e scusa per il ritardo nella replica.
Dunque, io devo trovare i ms per ottenere i giorni rimanenti in una differenza di date. Quindi, non ci saranno né sottrazioni, né addizioni, solo mi occorreva capire se ci fosse qualche
libreria JS che mi permettesse di manipolare velocemente le date e svolgere i calcoli. Non l'ho trovata (c'era
moment.js che facilitava molto le cose, ma ora è deprecata, quindi non più usufruibile).
A questo punto, mi sono arrangiato da solo. Ho scritto questa routine, che vi sottopongo, e che
spero vogliate valutare per capire se ci sono errori.
L'assunto di base è che il conto alla rovescia non partirà mai da una data > di 2 anni, quindi i mesi saranno sempre e solo in doppia cifra, e accetto di visualizzare valori > di 12 mesi.
La mia routine ricava gli anni e i mesi di partenza ed arrivo, e addiziona i giorni grazie ad un array che gestisce i mesi. In fondo, c'è anche un controllo che aggiunge giorni in caso di anni bisestili.
// data di termine
const endDate = 'Nov 2, 2023 19:00:25';
const countDownDate = new Date(endDate).getTime();
const countDownDateRif = new Date(endDate);
const dayPerMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
setInterval(function () {
let now = new Date().getTime();
let distance = countDownDate - now;
// --- calcolo dei mesi
let nowRif = new Date();
let monthsVal = 0;
let monthsDays = 0;
const annoIni = nowRif.getFullYear();
const annoFine = countDownDateRif.getFullYear();
const meseIni = nowRif.getMonth() + 1;
const meseFine = countDownDateRif.getMonth();
if ((annoFine - annoIni) > 1) {
monthsVal = (annoFine - annoIni - 1) * 12;
monthsDays = months * 365;
}
if ((annoFine != annoIni) || (annoIni == annoFine && meseFine != meseIni)) {
if (annoIni == annoFine) {
monthsVal = meseFine - meseIni;
for (var i = 0; i < monthsVal; i++) {
monthsDays = monthsDays + dayPerMonth[i];
}
} else {
monthsVal = 12 - meseIni + meseFine;
let indMonth = meseIni - 1;
for (var i = 0; i < monthsVal; i++) {
monthsDays = monthsDays + dayPerMonth[indMonth];
indMonth++;
if (indMonth == 12) indMonth = 0;
}
}
}
// aggiunta per anno bisestile
for (let i = annoIni; i <= annoFine; i++) {
switch (i) {
case annoIni:
if ((i % 4 == 0) && (meseIni <= 2)) monthsDays++;
break;
case annoFine:
if ((i % 4 == 0) && (meseFine >= 2)) monthsDays++;
break;
default:
if ((i % 4 == 0)) monthsDays++;
}
}
// calcolo mesi in ms (con sottrazione a 'distance')
distance = distance - (monthsDays * 1000 * 60 * 60 * 24);
}
Ho fatto alcune prove e sembra funzionare.
Se non è chiaro, ditelo che commento meglio in codice.