Track
/
JavaScript
JavaScript
/
Esercizi
/
Orario dell'appuntamento
Orario dell'appuntamento

Orario dell'appuntamento

Esercizio di apprendimento

Introduzione

JavaScript ha un oggetto integrato, Date, che memorizza data ed ora e fornisce metodi per gestirle.

Caution

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.

Creazione

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

Timestamp Unix (numero)

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.

Timestamp ISO 8601 (stringa)

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.

Caution

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.

Oggetto Date

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.

Fornire i singoli valori dei componenti di data ed ora

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.

Accedere ai componenti di 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.

Convertire da una data

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.

Confrontare le date

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.

Advanced

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

Istruzioni

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.

1. Crea un appuntamento

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.

2. Converti una data in un timestamp

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'

3. Ottieni i dettagli di un appuntamento

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 }

4. Aggiorna un appuntamento con le opzioni indicate

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 }

5. Ottieni il tempo disponibile tra due appuntamenti

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

6. Controlla se un appuntamento è valido oppure no

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
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
JavaScript Exercism

Vuoi iniziare Orario dell'appuntamento?

Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.