Calcolo dei mesi in una data in millesecondi

di il
2 risposte

Calcolo dei mesi in una data in millesecondi

Buongiorno.
Sto realizzando un COUNTDOWN, e ho il problema di sottrarre dalla differenza tra la data di termine e quella odierna i mesi mancanti.

La mia routine fino ai giorni è la seguente:

const countDownDate = new Date('Nov 2, 2023 00:00:25').getTime()
const now = new Date().getTime();
let distance = countDownDate - now;
let daysVal = Math.floor(distance / (1000 * 60 * 60 * 24));
let hoursVal = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
let minutesVal = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
let secondsVal = Math.floor((distance % (1000 * 60)) / 1000);
Ora, il mio problema è estrarre i millisecondi dei mesi per sottrarli all'inizio dei calcoli suddetti.
Per il numero dei mesi, ho provato ad utilizzare la libreria luxon, ma riesco solo a trovare il numero in cifre (numero float), e basta.
Sono certo che c'è una soluzione (nel web ho trovato qualche routine approssimativa, che prende per esempio un numero medio di 30 rappresentativo dei giorni in un mese), anche se credo non sia proprio così semplice.
Qualcuno ha qualche suggerimento, in merito?
Grazie.

2 Risposte

  • Re: Calcolo dei mesi in una data in millesecondi

    Non basta dire quanti mesi, visto che ci sono mesi da 28,29,30 e 31 giorni.

    da millisecondi puoi passare ad una data
    da una data puoi passare ai millisecondi

    ma per ragionare in termini di mesi, devi manipolare date e non millisecondi, inoltre ci sono un sacco di casi strani:
    30 gennaio + 1 mese che cosa fa?
    il 30 febbraio?
  • Re: Calcolo dei mesi in una data in millesecondi

    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.
Devi accedere o registrarti per scrivere nel forum
2 risposte