JavaScript: document.lastModified e l'oggetto Date

JavaScript: document.lastModified e l'oggetto Date

L'oggetto document ha tra le sue proprietà anche lastModified, la quale restituisce una stringa contenente le informazioni temporali (giorno, mese, anno, ora ecc.) sull'ultima modifica apportata al documento. Per quanto possa sembrare utile a prima vista, questa proprietà è del tutto ingestibile di per sè. Infatti il formato della stringa restituita dipende dal browser e quindi varia di implementazione in implementazione. Gli sviluppatori hanno preso l'abitudine di trasformare questa stringa in un oggetto Date passandola come parametro al costruttore di tale oggetto. Ma i risultati variano ancora. Vediamo perchè.

Dato che la stringa di partenza dipende dal browser, è chiaro che il nuovo oggetto Date creato non potrà essere coerente tra le implementazioni. Quindi il seguente codice:


var mDate = new Date(document.lastModified);
var month = mDate.getMonth()+1;
var day = mDate.getDate();
var year = mDate.getFullYear();
var hours = mDate.getHours() + 2;
var minutes = mDate.getMinutes();
var seconds = mDate.getSeconds();
    
var modificationDate = day + '/' + month + '/' + year + ' ' +
                       hours + ':' + minutes + ':' + seconds;

non restituirà sempre il risultato voluto. La stringa di partenza può essere sia nel formato Sat, Aug 6, 2011 18:00:00 che 6/8/2011, 18:00:00. Come si è detto prima, lastModified dipende dall'implementazione specifica del browser.

Un altro aspetto da considerare è il rapporto tra una pagina vista in locale e la stessa pagina vista in remoto. In locale in alcuni casi i browser non visualizzano la stringa risultante dalla conversione, specie se non è attiva alcuna connessione al web. In remoto, non è altresì chiaro se i browser utilizzino anche le informazioni sulla data e l'ora fornite dal server oltre alle informazioni specifiche del file.

Inoltre, cosa si intende per "ultima modifica"? Comunemente si dovrebbe affermare che il file è stato aperto, modificato e salvato. In realtà molti browser considerano anche una semplice operazione di copia del file come una modifica.

Il consiglio che posso dare in questo caso è quello di operare una normalizzazione della stringa prima di passarla all'oggetto Date, per esempio operando una detection del browser come la seguente:


var browser;
var ua = navigator.userAgent;

if(ua.indexOf('Chrome') != -1) {
  browser = 'Chrome';
} else if (ua.indexOf('Safari') != -1) {
  browser = 'Safari';
} else if(ua.indexOf('Opera') != -1) {
  browser = 'Opera';
} else if(ua.indexOf('Firefox') != -1) {
  browser = 'Firefox';
} else if(ua.indexOf('MSIE') != -1) {
  browser = 'Internet Explorer';
}

Test

Potete visionare il test in questa pagina.

Torna su