【问题标题】:Compare two dates Google apps script比较两个日期 Google Apps 脚本
【发布时间】:2012-06-24 01:39:32
【问题描述】:

比较两个日期的最佳方法是什么?

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() 选项,但这似乎只适用于 == 或 === 运算符。

这件事有什么清楚的吗?

【问题讨论】:

  • 这取决于您要比较的内容。你想比较日期呢?

标签: date datetime google-apps-script date-manipulation


【解决方案1】:

Date 对象具有 valueOf 方法,该方法返回自 1970 年 1 月 1 日午夜以来的毫秒数。您可以使用它来比较日期。类似的东西

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

【讨论】:

  • 你怎么知道的? Date 是什么类型(来自哪个库)?你能链接到它的文档吗?
  • @dinosaur,我通过执行类似于var d0 = new Date(0); var d1 = new Date(1); var str0 = d0.toISOString(); var str1 = d1.toISOString();的代码就知道了。一旦执行,str0 就有1970-01-01T00:00:00.000Z 值,str1 有1970-01-01T00:00:00.001Z 一个。此代码在 GAS 环境中执行。我假设 GAS 没有关于 Date 和其他从 JS 继承的基类的文档。以类似的方式,在 GAS 文档中找不到对 String 类的任何引用。
  • 这不适用于同等比较,因为date01 有时间,date02 时间是 00:00:00
【解决方案2】:

前段时间有人发过这个,我觉得很有帮助

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

【讨论】:

    【解决方案3】:
    // 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);
    }
    

    【讨论】:

      【解决方案4】:

      哇,我来晚了。我发现将日期转换为一年中的整数天是最容易的。所以 1 月 1 日是 1 日,2 月 1 日是 32 日,以此类推。

      这是脚本:

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

      如果您要从电子表格中获取值,只需将值放入 new Date():

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

      【讨论】:

      • 如果两个日期都在同一年,则此方法有效。如果日期在不同年份,则失败
      【解决方案5】:

      日期对象可以像任何其他变量一样进行比较。唯一棘手的事情是,例如,如果您需要比较同一天的两个日期并期望得到 date A = date B ,在这种情况下,您会遇到问题,因为日期还包括小时和分钟(以及秒 + 毫秒)! (这就是为什么我建议在您所指的帖子中使用字符串来检查相等性)。 您可以做的是在两个变量中将小时、分钟、秒和毫秒设置为 0,以便仅在日、月、年进行比较。 请参阅 w3schools date reference page 了解如何执行此操作。

      另一种可能性是使用Utilities.formatDate() 将两个日期都转换为字符串并使用substrings() 来获取您需要的数据,但我想这不是一个非常优雅的方法;-)

      【讨论】:

        【解决方案6】:

        我做了一些工作,虽然没那么迷人,但似乎有用。

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

        我也会查看其他答案并试一试。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多