web-dev-qa-db-fra.com

Comparer le script de deux applications Google dates

Quelle serait la meilleure façon de comparer deux dates?

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

J'ai vu l'option .toString () mais cela semble fonctionner uniquement pour l'opérateur == ou ===.

Quelque chose de clair à ce sujet?

16
Jacobvdb

L'objet Date a la méthode valueOf qui retourne le nombre de millisecondes depuis minuit 1970-01-01. Vous pouvez l'utiliser pour comparer les dates. Quelque chose comme

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

Quelqu'un a posté ça il y a quelque temps, je trouve que c'est très 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();
    }
}
14
JKWA
// 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);
}
5
cmaduro

Wow, je suis en retard ici. J'ai trouvé plus facile de convertir les dates en jour entier de l'année. Donc le 1er janvier serait 1, le 1er février serait 32, etc.

Voici ce script:

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

Si vous saisissez une valeur de votre feuille de calcul, placez simplement la valeur dans la nouvelle Date ():

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

J'ai fait un peu de travail autour, pas si charmant mais ça a l'air de 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) {....

Je vais également vérifier les autres réponses et faire un tour.

3
Jacobvdb

Les objets de date peuvent être comparés comme toutes les autres variables. La seule chose délicate est que si vous devez comparer deux dates le même jour par exemple et que vous vous attendez à obtenir la date A = la date B, dans ce cas, vous avez un problème car les dates incluent également les heures et les minutes (et les secondes + millisecondes)! (c'est pourquoi j'ai suggéré d'utiliser des chaînes pour vérifier l'égalité dans le message auquel vous faites référence). Ce que vous pouvez faire est de définir les heures, minutes, secondes et millisecondes à 0 dans les deux variables afin que la comparaison se fasse uniquement le jour, le mois et l'année. Voir page de référence de la date w3schools pour voir comment procéder.

Une autre possibilité serait de convertir les deux dates en chaînes en utilisant Utilities.formatDate() et de jouer avec substrings() pour obtenir les données dont vous avez besoin mais je suppose que ce n'est pas une manière très élégante de procéder ;-)

3
Serge insas