Uno dei compiti più impegnativi per le librerie di data e ora è l’analisi di date e orari internazionali. Sono disponibili in una gamma così ampia di formati che è quasi impossibile adattarli tutti. Diverse librerie di date affrontano questo problema utilizzando una varietà di soluzioni, alcune migliori di altre. Il momento.js e Data Luxon le librerie utilizzano un approccio simile all’analisi della data utilizzando le stringhe di formato Data. Nel blog di oggi impareremo come creare oggetti Luxon Date da stringhe Datetime.
Metodi di analisi della data ISO 8601
I creatori di Luxon sono i primi ad ammettere che non si tratta di uno strumento di elaborazione del linguaggio naturale (NLP). Detto questo, fornisce supporto diretto per diversi formati noti, inclusi i formati ISO 8601, nonché un parser ad hoc per l’analisi di formati specifici.
DateTime.fromISO()
ISO 8601 è un formato di interscambio per dati relativi a data e ora. È gestito dall’Organizzazione internazionale per la standardizzazione (ISO) con sede a Ginevra ed è stato pubblicato per la prima volta nel 1988 con aggiornamenti nel 1991, 2000, 2004 e 2019. Copre molti formati diversi ed è ampiamente supportato, quindi li guarderei prima di provare qualunque altra cosa. Ecco alcuni esempi di date e orari ISO 8601:
- Data: 2021-05-16
- Data e ora in UTC: 2021-05-16T16:03:44+00:00, 2021-05-16T16:03:44Z, 20210516T160344Z
- Settimana: 2021-W19
- Settimana con feriale: 2021-W19-7
- Data senza anno: –05-16
- Data ordinale: 2021-136
In caso di dubbio, puoi sempre provare a passare il tuo appuntamento stringa a DateTime.fromISO() e guarda cosa succede:
// valid datetime var luxonDate = DateTime.fromISO("2021-05-16T16:03:44+00:00"); //invalid console.log(luxon.DateTime.fromISO('Wed, 02 Jun 2021'));
Se la stringa non può essere analizzata, sarai in grado di vederla nell’attributo invalid:
Formati HTTP e RFC2822
Le intestazioni HTTP e le e-mail seguono i propri standard di formattazione: RFC 850 e 1123 per le specifiche dell’intestazione HTTP e RFC 2822 per le e-mail. I parser di Luxon per questi formati sono da HTTP() e daRFC2822() rispettivamente. Ecco alcuni esempi:
DateTime.fromHTTP("Sunday, 06-Nov-94 08:49:37 GMT"); DateTime.fromHTTP("Sun, 06 Nov 1994 08:49:37 GMT"); DateTime.fromRFC2822("Tue, 01 Nov 2016 13:23:12 +0630");
Date SQL
Luxon accetta date, orari e datetime SQL standard tramite il da SQL() metodo. Puoi anche passargli un parametro options che specifica il fuso orario, le impostazioni internazionali e altri dettagli.
Ecco alcuni esempi:
DateTime.fromSQL("2017-05-15"); DateTime.fromSQL("2017-05-15 09:24:15"); DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles'); DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' });
Timestamp
Come probabilmente saprai, le date JS sono memorizzate come un timestamp noto come Tempo di Unix, Tempo dell’epoca, e Tempo POSIX che rappresenta il numero di secondi trascorsi dall’epoca Unix, 00:00:00 UTC del 1 gennaio 1970, meno i secondi intercalari. I timestamp possono contenere o meno millisecondi, quindi ci sono metodi separati per ciascuno:
DateTime.fromMillis(1542674993410); DateTime.fromSeconds(1542674993); // from a JS Date object DateTime.fromSeconds(new Date().getTime());
Creazione di un oggetto Luxon DateTime da una data JS
Un modo ancora più semplice per creare un oggetto Luxon DateTime da una data JS rispetto a quanto visto nell’esempio precedente è utilizzare il fromJSDate() metodo. No prendi tempo() invocazione obbligatoria!
var jsDate = new Date(); DateTime.fromJSDate(jsDate);
Analisi ad hoc con DateTime.fromFormat()
DateTime.fromFormat() è molto utile per lavorare con le stringhe di alcuni sistemi legacy o per analizzare le date in una pagina web che non segue nessuno dei suddetti formati. Caso in questione, ho creato una demo che analizza le date delle prossime conferenze a Londra, Regno Unito. Questi sono espressi in formato “mer, 02 giugno 2021,/” per eventi di un giorno e “mar 01 – mercoledì 02 giugno 2021” per eventi di più giorni.
Suddividere gli eventi di più giorni in date di inizio e di fine
Gli eventi di più giorni sono facilmente individuabili dal trattino (-), che indica un intervallo di date. Ho usato jQuery per scorrere eventi e quindi dividere il loro contenuto in un array di due elementi. Poi un sostituire() viene eseguito che prende la parte del giorno e del mese della data di fine e la sostituisce con quelli della prima data per ottenere la data di inizio:
var inputFormat = "ccc, dd LLL yyyy", eventTimes = $('.eventTime'), startDates = new Array(eventTimes.length), endDates = new Array(eventTimes.length); eventTimes.each(function(index) { // remove extra newlines and spaces in source var eventDates = $(this).text().replace(/ns+/,' ').split(' - '); // check if date range if (eventDates.length === 2) { var startDate = eventDates[1].replace(/[a-zA-Z]{3}, d{2}/, eventDates[0]); startDates[index] = luxon.DateTime.fromFormat(startDate, inputFormat, {zone: 'utc'}); endDates[index] = luxon.DateTime.fromFormat(eventDates[1], inputFormat, {zone: 'utc'}); } });
Analisi delle date
Il fromFormat() il metodo accetta un lungo elenco di gettoni. Per i nostri scopi, la stringa di formato completo è “ccc, dd LLL aaaa”.
var inputFormat = "ccc, dd LLL yyyy"; eventTimes.each(function(index) { // remove extra newlines and spaces in source var eventDates = $(this).text().replace(/ns+/,' ').split(' - '); if (eventDates.length === 1) { startDates[index] = luxon.DateTime.fromFormat(eventDates[0], inputFormat, {zone: 'utc'}); } else if (eventDates.length === 2) { //... } });
Ecco la demo in cui risiede il codice sopra:
Guarda la penna Dimostrazione di analisi della data di Luxonon di Rob Gravelle (@blackjacques) su CodePen.
Non sta succedendo nulla di eccitante perché non abbiamo fatto nulla con gli oggetti Luxon Date (ancora), ma puoi sempre modificare il codice in Codepen aggiungendo console.log() affermazioni che mostrano cosa date di inizio e date di fine gli array contengono. Il prossimo tutorial riguarderà i formati di output modificando la demo sopra per trasformare le stringhe della data di input in vari formati di output.
Rob Gravelle risiede a Ottawa, in Canada, ed è un guru IT da oltre 20 anni. In quel periodo, Rob ha costruito sistemi per organizzazioni legate all’intelligence come Canada Border Services e varie attività commerciali. Nel suo tempo libero, Rob è diventato un artista musicale affermato con diversi CD e uscite digitali a suo merito.