Analisi di date e ora utilizzando Luxon
Tempo di lettura: 4 minuti

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.

Source link

Di Simone Serra

Web Designer Freelancer Realizzazione Siti Web Serra Simone Realizzo siti web, portali ed e-commerce con focus specifici sull’usabilità, l’impatto grafico, una facile gestione e soprattutto in grado di produrre conversioni visitatore-cliente. Elaboro siti internet, seguendo gli standard Web garantendo la massima compatibilità con tutti i devices. Sviluppo e-commerce personalizzati, multilingua, geolocalizzati per potervi mettere nelle migliori condizioni di vendita. Posiziono il tuo sito su Google per dare maggiore visibilità alla tua attività sui motori di ricerca con SEO di base o avanzato.