JavaScript ha un oggetto integrato, Date, che memorizza data ed ora e fornisce metodi per gestirle.
Si basa sulla classe java.util.Date di Java, che è stata sostituita nei primi anni 2010, ma per compatibilità con il passato il Date di JavaScript è rimasto in vita.
Dato che lavorare con le date è difficile in generale e dato che la gestione dei fusi orari è scarsa o del tutto assente, esistono molte librerie come moment.js, day.js, date-fns e luxon.
Nessuna di queste è disponibile su Exercism.
Nei tuoi progetti, non usare un pacchetto deprecato o non più mantenuto come moment.js: affidati ad alternative più moderne come luxon, oppure a Temporal, che non è ancora largamente disponibile.
Questo esercizio si concentra su Date, che resterà rilevante fino alla fine di JavaScript.
Un oggetto Date è un'istanza della classe Date.
Si può creare senza passare alcun argomento alla funzione costruttrice.
Il risultato è un oggetto Date che rappresenta la data e l'ora attuali:
const now = new Date();
// => Thu Apr 14 2022 11:46:08 GMT+0530 (India Standard Time)
// Shows current day, date and time (in your time zone).
Se si passa un numero, questo viene interpretato come timestamp.
Un timestamp è un numero intero che rappresenta il numero di millisecondi trascorsi dal 1º gennaio 1970 UTC+0.
const epoch = new Date(0);
// Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)
const another = new Date(1749508766627);
// Tue Jun 10 2025 00:39:26 GMT+0200 (Central European Summer Time)
Ci si potrebbe aspettare che new Date(0) generi l'oggetto data «più antico», ma JavaScript converte la data nel tuo fuso orario locale: significa che solo chi si trova in un fuso GMT / UTC+0 otterrà davvero il valore dell'epoca Unix.
Puoi passare alla funzione costruttrice Date una stringa che rappresenta una data.
L'unico formato coerente tra le varie implementazioni è la versione semplificata delle cosiddette stringhe di timestamp ISO 8601, riconosciute e standardizzate a livello internazionale.
Un istante nel tempo in UTC si scrive così:
YYYY-MM-DDTHH:mm:ss.mssZ
YYYYMMDDTHHmmss.mssZ
Dove valgono le seguenti sostituzioni:
| Chiave | Descrizione | Predefinito |
|---|---|---|
| YYYY | L'anno, rappresentato con 4 cifre | |
| MM | Il mese, rappresentato con 2 cifre | 01 |
| DD | Il giorno del mese, rappresentato con 2 cifre | 01 |
| T | Una T letterale, che separa la data dall'ora | |
| HH | Le ore in un formato a 24 ore, 2 cifre | 00 |
| mm | I minuti, 2 cifre | 00 |
| ss | I secondi, 2 cifre | 00 |
| mss | I millisecondi, 3 cifre | 000 |
| Z | Una Z letterale, oppure uno scostamento +/-HH:mm
|
La lettera Z indica UTC (nessun fuso orario, nessuna ora legale).
Dato che la maggior parte dei componenti ha un valore predefinito, è valido omettere le parti finali:
YYYY-MM-DD
Il valore predefinito è l'ora 00:00:00.000
Se il timestamp non termina con Z e non termina con +HH:mm o -HH:mm (che indicano uno scostamento di fuso orario), per ragioni storiche vale quanto segue:
Quando lo scostamento di fuso orario è assente, le forme che contengono solo la data vengono interpretate come ora UTC, mentre quelle che contengono data ed ora vengono interpretate come ora locale. L'interpretazione come ora UTC è dovuta a un errore storico della specifica, non coerente con ISO 8601, che non è stato possibile correggere per via della compatibilità con il web. Vedi Broken Parser – A Web Reality Issue.
Altri formati accettati da Date.parse possono funzionare o meno.
Quando lavori con le date in JavaScript, usa sempre un timestamp ISO 8601 per convertire da una string a una Date.
Le forme con la sola data sono ammesse, ma non tutti i formati ISO 8601 sono supportati. Consulta la pagina di spiegazione della versione semplificata su MDN.
Anche un oggetto data esistente può essere usato come argomento della funzione costruttrice.
In questo modo si crea una copia dell'oggetto Date esistente, con la stessa data ed ora.
const t1 = new Date();
const t2 = new Date(t1);
// Values of t1 and t2 will be the same.
Un oggetto data che rappresenta una data si crea passando tre numeri. Un oggetto data che rappresenta una data ed un'ora si crea passando 6 numeri.
const date1 = new Date(95, 11, 17);
// Creates Date for Dec 17 1995 00:00 if your local timezone is equivalent to UTC.
const date2 = new Date(2013, 12, 5, 13, 24, 0);
// Creates Date for Jan 5 2014 13:24 if your local timezone is equivalent to UTC.
Il secondo valore è il month, che parte da 0 per gennaio e arriva a 11 per dicembre.
Date.parse()Potresti imbatterti in riferimenti a una funzione di analisi delle date, Date.parse.
Dato che per questa funzione esistono solo poche invarianti (verità) e che il resto dell'implementazione non è specificato (e quindi non è standard), è meglio non usarla.
Date
Gli oggetti data hanno vari metodi che restituiscono i componenti della data:
getFullYear(); // Get the year (4 digits)
getMonth(); // Get the month, from 0 to 11.
getDate(); // Get the day of month, from 1 to 31.
getHours(); // Get the hour in a 24 clock, from 0 to 23
getMinutes(); // Get the minutes, from 0 to 59
getSeconds(); // Get the seconds, from 0 to 59
getMilliseconds(); // Get the milliseconds, from 0 and 999
getDay(); // Get the day of week, from 0 (Sunday) to 6 (Saturday).
Ognuno di questi ha una variante set corrispondente (ad esempio setFullYear) per aggiornare il valore.
Ogni valore che va oltre il limite si riporta sul componente successivo:
const date = new Date('2025-02-28T12:42:00Z');
// => Fri Feb 28 2025 13:42:00 GMT+0100 (Central European Standard Time)
date.setDate(29);
// there was no February 29th in 2025.
date.getDate();
// => 1
date.toString();
// => Sat Mar 01 2025 13:42:00 GMT+0100 (Central European Standard Time)
Per tutti i metodi esistono varianti UTC che ignorano il fuso orario locale.
Gli oggetti data hanno un metodo getTime() che restituisce il timestamp UNIX in millisecondi, cioè il numero di millisecondi trascorsi dalla mezzanotte del 1º gennaio 1970 UTC.
Inoltre è disponibile un metodo toISOString() per convertire un oggetto data in una stringa di timestamp ISO 8601.
Gli operatori maggiore di (>), maggiore o uguale (>=), minore di (<) e minore o uguale (<=) si possono usare direttamente tra due date, oppure tra una data ed un numero.
Funziona perché JavaScript prova a convertire la data in un primitivo.
Quando esegue un confronto tra due date, o tra una data ed un numero, JavaScript chiama [Symbol.toPrimitive]("number"), che a sua volta chiama date.valueOf().
Quest'ultimo equivale a chiamare date.getTime().
Se non vuoi affidarti a questo comportamento, converti prima in un numero con getTime().
Le date non si possono confrontare con gli operatori di uguaglianza (== e ===), ma il risultato di .getTime() sì.
In questo esercizio lavorerai su alcune funzioni per gestire gli appuntamenti. Il sistema memorizza tutto in stringhe formattate secondo lo standard ISO 8601, ma non è così che le persone usano il calendario. Servono diverse funzioni per convertire tra i vari formati.
Crea un appuntamento tra n giorni da adesso, all'ora corrente.
La funzione prende n giorni e restituisce l'orario dell'appuntamento a n giorni da adesso.
createAppointment(4, now);
// Given now is Sun Oct 05 2022 23:28:43 GMT+0600 (Bangladesh Standard Time)
// => Sun Oct 09 2022 23:28:43 GMT+0600 (Bangladesh Standard Time)
Se il secondo parametro now non viene usato, al suo posto va usata l'ora corrente.
Diversi strumenti funzionano solo con il formato ISO 8601, lo standard internazionale.
Scrivi la funzione getAppointmentTimestamp in modo che prenda una data e restituisca una stringa in quel formato.
const appointment = new Date(Date.UTC(2010, 6, 16, 12, 42, 0, 0));
getAppointmentTimestamp(appointment);
// => '2010-07-16T12:42:00.000Z'
I timestamp sono difficili da leggere. Una funzione per ottenere i dettagli dell'appuntamento dovrebbe aiutare.
La funzione getAppointmentDetails prende un timestamp nel formato ISO 8601 e restituisce l'anno, il mese, la data, l'ora e i minuti.
getAppointmentDetails('2022-04-24T08:15:00.000');
// => { year: 2022, month: 3, date: 24, hour: 8, minute: 15 }
La funzione riceverà come primo argomento l'orario dell'appuntamento e come secondo argomento un oggetto con alcune opzioni. Devi aggiornare l'appuntamento in base alle opzioni presenti nell'oggetto e restituire la nuova data dell'appuntamento. L'oggetto delle opzioni può contenere più opzioni.
updateAppointment('2022-02-09T09:20:00.000', { month: 6 });
// => { year: 2022, month: 6, date: 9, hour: 10, minute: 20 }
La funzione riceverà come argomenti due appuntamenti (timestamp). Devi restituire la differenza tra questi due orari in secondi.
Dato che mezzo secondo non ha quasi significato, arrotonda il numero prima di restituirlo.
timeBetween('2022-12-12T09:20:00.000', '2022-12-18T08:30:00.000');
// => 515400
Infine, quando viene fissato un appuntamento, il sistema deve controllare se è valido. In altre parole, l'appuntamento deve essere nel futuro, non nel passato.
Scrivi la funzione isValid che prende due argomenti, un timestamp dell'appuntamento (una stringa) e l'ora corrente come timestamp (una stringa), e restituisce true se l'appuntamento è nel futuro rispetto all'ora corrente.
isValid('2022-02-11T23:00:00.000', '2022-02-08T23:00:00.000');
// => true
Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.