2012-06-24 302 views
11

¿Cuál sería la mejor manera de comparar dos fechas?Comparar dos fechas Google apps script

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

Vi la opción .toString() pero parece funcionar solo para el operador == o ===.

¿Hay algo claro sobre este asunto?

+0

depende LO QUE usted quiere comparar. ¿Qué pasa con la fecha que quieres comparar? – mzimmerman

Respuesta

3

Los objetos de fecha se pueden comparar como cualquier otra variable. Lo único difícil es si necesita comparar dos fechas en el mismo día, por ejemplo, y esperar obtener la fecha A = fecha B, en este caso tiene un problema ya que las fechas también incluyen horas y minutos (y segundos + milisegundos). (Es por eso que sugerí usar cadenas para verificar la igualdad en la publicación a la que se refiere). Lo que podría hacer es establecer horas, minutos, segundos y milisegundos en 0 en ambas variables, por lo que la comparación solo se realiza el día, mes y año. Consulte w3schools date reference page para ver cómo hacerlo.

Otra posibilidad sería convertir ambas fechas para cuerdas utilizando Utilities.formatDate() y jugar con substrings() para obtener los datos que necesita, pero supongo que esto no es una forma muy elegante para proceder ;-)

18

El objeto tiene el DatevalueOf método que devuelve el número de milisegundos desde la medianoche del 1970-01-01. Puedes usarlo para comparar fechas. Algo así como

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

¿Cómo se puede saber esto? ¿Qué tipo (de qué biblioteca) es Date? ¿Puedes vincular a su documentación? – dinosaur

+0

@dinosaur, lo sé ejecutando el código similar a 'var d0 = new Date (0); var d1 = new Fecha (1); var str0 = d0.toISOString(); var str1 = d1.toISOString(); '. Tan pronto como se ejecuta, str0 tiene el valor '1970-01-01T00: 00: 00.000Z' y str1 tiene' 1970-01-01T00: 00: 00.001Z' uno. Este código se ejecuta en el entorno GAS. Supongo que GAS no tiene documentación para Date y otras clases base heredadas de JS. De manera similar, no se puede encontrar ninguna referencia a la clase String en la documentación de GAS. – megabyte1024

+0

javascript month comienza con 0, simplemente se quedó atascado por un tiempo ... –

9

Alguien ha publicado esto hace un tiempo, me parece que es muy útil

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

lo hice un poco de trabajo arround, no tan encantador pero parece servir.

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

Voy a echar un vistazo a las otras respuestas también y darle 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, llegué tarde aquí. Me pareció más fácil convertir las fechas en el entero Día del año. Así 1 ª Ene sería 1, 1 Feb sería 32, etc.

Aquí es que el guión:

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

Si usted está tomando un valor a partir de la hoja de cálculo, basta con colocar el valor en la nueva fecha():

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