2012-06-24 5 views
11

Quale sarebbe il modo migliore per confrontare due date?Confronta due date script per Google apps

var int = e.parameter.intlistbox; 
var startDate = rSheet.getRange(parseInt(int) + 1 ,1).getValues(); 
// returns Sat Jun 30 2012 00:00:00 GMT-0300 (BRT) 
var toDay = new Date(); 
// Sat Jun 23 2012 22:24:56 GMT-0300 (BRT) 

if (startDate > toDay){ .... 

Ho visto l'opzione .toString() ma sembra funzionare solo per l'operatore == o ===.

Qualcosa di chiaro su questo argomento?

+0

dipende COSA si desidera confrontare. Che mi dici della data che vuoi confrontare? – mzimmerman

risposta

3

Gli oggetti data possono essere confrontati come qualsiasi altra variabile. L'unica cosa complicata è se devi confrontare due date nello stesso giorno, ad esempio, e aspettarti di ottenere la data A = date B, in questo caso hai un problema poiché le date includono anche ore e minuti (e secondi + millisecondi)! (è per questo che ho suggerito di usare le stringhe per controllare l'uguaglianza nel post a cui fai riferimento). Quello che potresti fare è impostare ore, minuti, secondi e millisecondi su 0 in entrambe le variabili, in modo che il confronto avvenga solo giorno, mese, anno. Vedere w3schools date reference page per vedere come farlo.

Un'altra possibilità sarebbe quella di convertire entrambe le date in stringhe utilizzando Utilities.formatDate() e giocare con substrings() per ottenere i dati necessari, ma credo che questo non è un modo molto elegante per procedere ;-)

18

L'oggetto ha la Date Metodo valueOf che restituisce il numero di millisecondi dalla mezzanotte del 1970-01-01. Puoi usarlo per confrontare le date. Qualcosa di simile

var date01 = new Date(); 
var date02 = new Date(2012, 5, 24); 
if (date01.valueOf() > date02.valueOf()) { 
    .... 
} 
+0

Come lo sai? Che tipo (da quale libreria) è Data? Puoi collegare alla sua documentazione? – dinosaur

+0

@dinosaur, lo so eseguendo il codice simile a 'var d0 = new Date (0); var d1 = new Date (1); var str0 = d0.toISOString(); var str1 = d1.toISOString(); '. Non appena viene eseguito, lo str0 ha valore '1970-01-01T00: 00: 00.000Z' e str1 ha' 1970-01-01T00: 00: 00.001Z'. Questo codice viene eseguito nell'ambiente GAS. Presumo che GAS non abbia documentazione per Data e altre classi base ereditate da JS. In modo simile non è possibile trovare alcun riferimento alla classe String nella documentazione GAS. – megabyte1024

+0

il mese di javascript inizia con 0, è rimasto bloccato per un po '... –

9

Qualcuno postato un po 'indietro, lo trovo molto utile

function testDate() { 
    var futureDate = new Date('8/31/2020'); 
    var todayDate = new Date(); 
    Logger.log(DateDiff.inMonths(todayDate, futureDate)); 
    Logger.log(DateDiff.inYears(todayDate, futureDate));    
} 

var DateDiff = {  
    inDays: function(d1, d2) { 
     var t2 = d2.getTime(); 
     var t1 = d1.getTime(); 

     return parseInt((t2-t1)/(24*3600*1000)); 
    }, 
    inWeeks: function(d1, d2) { 
     var t2 = d2.getTime(); 
     var t1 = d1.getTime(); 

     return parseInt((t2-t1)/(24*3600*1000*7)); 
    }, 
    inMonths: function(d1, d2) { 
     var d1Y = d1.getFullYear(); 
     var d2Y = d2.getFullYear(); 
     var d1M = d1.getMonth(); 
     var d2M = d2.getMonth(); 

     return (d2M+12*d2Y)-(d1M+12*d1Y); 
    }, 
    inYears: function(d1, d2) { 
     return d2.getFullYear()-d1.getFullYear(); 
    } 
} 
1

Ho fatto un po' di lavoro arround, non così affascinante ma sembra servire.

var startDate = rSheet.getRange(parseInt(int) + 1 ,1).getValues(); 
var toDay = new Date(); 

var sYyyy = Utilities.formatDate(new Date(startDate), "GMT-2","yyyy"); 
var sMm = Utilities.formatDate(new Date(startDate), "GMT-2","MM"); 
var sDd = Utilities.formatDate(new Date(startDate), "GMT-2","dd"); 

var tYyyy = Utilities.formatDate(new Date(toDay), "GMT-2","yyyy"); 
var tMm = Utilities.formatDate(new Date(toDay), "GMT-2","MM"); 
var tDd = Utilities.formatDate(new Date(toDay), "GMT-2","dd"); 


if (sYyyy + sMm + sDd > tYyyy + tMm + tDd) {.... 

I'll controllare le altre risposte come bene e dare un giro.

4
// Date, Date -> Number 
// Get the number of days between two dates 

test("Date Diff In Days", 5, function(){ 
    ok(DateDiffInDays(new Date("January 1, 2000"), new Date("January 1, 2000")) == 0, "Ok"); 
    ok(DateDiffInDays(new Date("January 1, 2000"), new Date("January 2, 2000")) == 1, "Ok"); 
    ok(DateDiffInDays(new Date("January 1, 2000"), new Date("January 11, 2000")) == 10, "Ok"); 
    ok(DateDiffInDays(new Date("January 11, 2000"), new Date("January 1, 2000")) == -10, "Ok"); 
    ok(DateDiffInDays(new Date("January 1, 2000"), new Date("April 10, 2000")) == 100, "Ok"); 
}); 


function DateDiffInDays(a, b) 
{ 
    var _MS_PER_DAY = 1000 * 60 * 60 * 24; 
    // Discard the time and time-zone information. 
    var utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate()); 
    var utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate()); 
    return Math.floor((utc2 - utc1)/_MS_PER_DAY); 
} 
3

Wow, sono in ritardo qui. Ho trovato più facile convertire le date nel giorno intero dell'anno. Quindi 1 gennaio sarebbe 1, 1 febbraio sarebbe 32, ecc

Ecco lo script:

today = parseInt(Utilities.formatDate(new Date(),"EST","D")); 

Se stai afferrando un valore dal foglio di lavoro, è sufficiente posizionare il valore nella nuova data():

today = parseInt(Utilities.formatDate(new Date(rSheet.getRange(parseInt(int) + 1 ,1).getValues()),"EST","D"));