web-dev-qa-db-ja.com

2つの日付のGoogleアプリスクリプトを比較する

2つの日付を比較に最適な方法は何ですか?

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

.toString()オプションを見ましたが、==または===演算子でのみ機能するようです。

この問題について明確なことはありますか?

16
Jacobvdb

Dateオブジェクトには、1970-01-01の午前0時からのミリ秒数を返すvalueOfメソッドがあります。これを使用して、日付を比較できます。何かのようなもの

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

誰かがしばらく前にこれを投稿しました、私はそれが非常に役立つと思います

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

うわー、私はここに遅れています。日付を整数の曜日に変換するのが最も簡単であることがわかりました。したがって、1月1日は1、2月1日は32などとなります。

そのスクリプトは次のとおりです。

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

スプレッドシートから値を取得する場合は、値を新しいDate()に配置するだけです。

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

私はそれほど魅力的ではありませんが、少し仕事をしましたが、役立つようです。

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

他の回答もチェックして、試してみましょう。

3
Jacobvdb

日付オブジェクトは、他の変数と同様に比較できます。唯一注意が必要なのは、たとえば同じ日の2つの日付を比較し、日付A =日付Bを取得する必要がある場合です。この場合、日付には時間と分(および秒+ミリ秒)も含まれるため、問題が発生します! (だから、参照する投稿で平等を確認するために文字列を使用することを提案しました)。両方の変数で時間、分、秒、ミリ秒を0に設定すると、日、月、年のみで比較が行われます。 w3schools date reference page を参照して、その方法を確認してください。

別の可能性は、Utilities.formatDate()を使用して両方の日付を文字列に変換し、substrings()で再生して必要なデータを取得することですが、これは非常にエレガントな方法ではないと思います;-)

3
Serge insas