Vergelijk Google-script met twee datums

Wat zou de beste manier zijn om twee datums te vergelijken ?

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

Ik zag de. ToString() optie, maar dat lijkt alleen te werken voor == of === operator.

Is er iets duidelijk over deze kwestie?

11
het hangt ervan af wat je wilt vergelijken. Hoe zit het met de datum wil je vergelijken?
toegevoegd de auteur mzimmerman, de bron

6 antwoord

Het object Datum heeft de methode valueOf waarmee het aantal milliseconden sinds middernacht 1970-01-01 wordt geretourneerd. U kunt het gebruiken om datums te vergelijken. Zoiets als

var date01 = new Date();
var date02 = new Date(2012, 5, 24);
if (date01.valueOf() > date02.valueOf()) {
   ....
}
20
toegevoegd
@dinosaur, ik weet het door de code uit te voeren die lijkt op var d0 = new Date (0); var d1 = nieuw Datum (1); var str0 = d0.toISOString (); var str1 = d1.toISOString (); . Zodra het is uitgevoerd, heeft de str0 de waarde 1970-01-01T00: 00: 00.000Z en heeft str1 1970-01-01T00: 00: 00.001Z één. Deze code wordt uitgevoerd in de GAS-omgeving. Ik neem aan dat GAS geen documentatie heeft voor Date en andere basisklassen die zijn overgenomen van JS. Op dezelfde manier kan geen verwijzing naar de klasse String in de GAS-documentatie worden gevonden.
toegevoegd de auteur megabyte1024, de bron
javascript-maand begint met 0, is er een tijdje mee gestopt ...
toegevoegd de auteur Walty Yeung, de bron
Hoe weet je dit? Welk type (uit welke bibliotheek) is Date? Kun je linken naar zijn documentatie?
toegevoegd de auteur dinosaur, de bron

Iemand heeft dit een tijdje geleden gepost, ik vind het erg nuttig

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();
    }
}
11
toegevoegd
// 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
toegevoegd

Wauw, ik ben laat hier. Ik vond het het gemakkelijkst om de datums om te zetten in het gehele getal van de dag van het jaar. Dus 1 januari zou 1 zijn, 1 februari zou 32 zijn, enz.

Hier is dat script:

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

Als u een waarde uit uw spreadsheet haalt, plaatst u de waarde in de nieuwe Date ():

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

Datumobjecten kunnen net als andere variabelen worden vergeleken. Het enige lastige is als je bijvoorbeeld twee datums op dezelfde dag moet vergelijken en verwacht datum A = datum B te krijgen, in dit geval heb je een probleem aangezien datums ook uren en minuten (en seconden + milliseconden) bevatten! (daarom stelde ik voor om strings te gebruiken om gelijkheid te controleren in de post waarnaar je verwijst). Wat u kunt doen, is om in beide variabelen uren, minuten, seconden en milliseconden in te stellen op 0, zodat de vergelijking alleen op dag, maand en jaar plaatsvindt. Zie de w3schools datumverwijzingpagina om te zien hoe u dat moet doen.

Een andere mogelijkheid is om beide datums naar strings te converteren met Utilities.formatDate() en te spelen met substrings() om de benodigde gegevens te krijgen, maar ik denk dat dit niet erg is elegante manier om verder te gaan ;-)

3
toegevoegd

Ik heb een beetje gewerkt, niet zo charmant, maar het lijkt te dienen.

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

Ik zal ook de andere antwoorden bekijken en er een draai aan geven.

1
toegevoegd