【问题标题】:How to subtract 5 days from a defined date - Google App Script如何从定义的日期中减去 5 天 - Google App Script
【发布时间】:2023-02-13 15:38:47
【问题描述】:

我正在尝试编写一个脚本来从定义的日期中减去 5 天,但似乎不起作用,这是我的代码:

var End_Day = sheet.getRange(i + 2, 20).getValue();
Logger.log(End_Day);
var End_day_2 = new Date();
End_day_2.setDate(End_Day.getDate()-5);
Logger.log(End_day_2);

结果不仅仅是 - 5 天:

11:18:47 AM Info    Sat Jun 04 00:00:00 GMT+08:00 2022
11:18:47 AM Info    Fri Apr 29 11:18:47 GMT+08:00 2022

我很困惑为什么日期从六月改到四月。

谢谢你看看

【问题讨论】:

  • 减去 5 天的毫秒数:60*60*24*5 = 432000 * 1000 = 432000000
  • 问题是您是从当前日期减去 5 天,而不是从单元格值中减去。您需要从单元格值创建一个日期对象,然后从中减去 5 天。

标签: javascript date google-apps-script


【解决方案1】:

尝试:

var End_Day = sheet.getRange(i + 2, 20).getValue();
var End_day_2 = new Date(End_Day.getTime() - (5 * (1000 * 60 * 60 * 24)))
Logger.log(End_Day);
Logger.log(End_day_2);

功能:

const endDay = sheet.getRange(i + 2, 20).getValue()
const endDay2 = DateFromDaysAgo(endDay, 5)

...

function DateFromDaysAgo(startDate, number) {

  if (typeof startDate === `string`) { startDate = new Date(startDate) }

  return new Date(startDate.getTime() - (number * (1000 * 60 * 60 * 24)))

}

【讨论】:

    【解决方案2】:

    你应该了解更多关于Date.prototype.setDate()的信息。它只会改变每月的某天给定日期实例的。

    正如您发布的代码,根据控制台结果,End_Day 的月份是4End_day_2.setDate(4 - 5) 等于End_day_2.setDate(-1)End_day_2 的月份是四月,因为有 30 天四月,setDate(-1) 表示setDate(29),所以你最后得到了Apr 29。事情就是这样。

    一种正确的做法是减去 5 天的毫秒数。

    function addDays(date, days){
      const DAY_IN_MILLISECONDS = 24 * 60 * 60000;
      return new Date(date.getTime() + days * DAY_IN_MILLISECONDS);
    }
    
    console.log(addDays(new Date(), -5).toString()); // 5 days ago

    【讨论】:

      【解决方案3】:

      我很困惑为什么日期从六月改到四月。

      这是因为您将日期设置在今天 (End_day_2) 而不是您预定义的日期 (End_day)。

      改变

      End_day_2.setDate(End_Day.getDate()-5);
      

      End_Day.setDate(End_Day.getDate()-5);
      console.info(End_Day);
      

      【讨论】:

        【解决方案4】:

        如果来自工作表的是字符串,则必须将日期字符串转换为日期对象。

        另一件事是你必须在毫秒内工作,正如@vanowm 所说:

        606024*5 = 432000 * 1000 = 432000000

        所以完全跳过工作表:

        x = new Date
        > Fri May 27 2022 11:24:01 GMT-0400 (Eastern Daylight Time)
        
        y = new Date(x - 432000000)
        > Sun May 22 2022 11:24:01 GMT-0400 (Eastern Daylight Time)
        

        【讨论】:

        • @TheMaster 你可能是对的,getValue 返回一个日期对象。我想这取决于工作表值格式。我只是在那里做了一个假设。我已经澄清了我的答案。
        • 我认为也没有必要计算ms。只是 setDate() 将保持以前的 ms
        【解决方案5】:

        这样就可以了。适用于任何日期并可以减去任意天数

        const subtractDays = (fromDate, numDays) => {
          if (!(fromDate instanceof Date)) throw 'The first argument must be a date';
          return new Date(new Date().setDate(fromDate.getDate() - +numDays));
        };
        

        【讨论】:

          【解决方案6】:

          一周前

          function weekago() {
            let dt = new Date();
            dt.setDate(dt.getDate()-7);
            Logger.log(dt);
            return dt;
          }
          

          五天前

          function fiveago() {
            let dt = new Date();
            dt.setDate(dt.getDate()-5)
            Logger.log(dt);
            return dt;
          }
          

          从电子表格单元格中的日期算起五天

          function fivefromadateinspreadsheet() {
            const v = SpreadsheetApp.getActiveSheet().getRange("A1").getValue();
            let dt = new Date(v);
            dt.setDate(dt.getDate()-5);//Note that does not return a date it return the numbrer of milliseconds
            Logger.log(dt);
            return dt;
          }
          

          【讨论】:

            【解决方案7】:

            您可以使用 Utilities.formatDate() 方法从 Google App Script 中定义的日期减去 5 天。这是一个例子:

            function subtractDays() {
              var date = new Date();
              var subtractDays = 5;
            
              // Subtract 5 days from the current date
              date.setDate(date.getDate() - subtractDays);
            
              // Format the new date
              var newDate = Utilities.formatDate(date, "UTC", "yyyy-MM-dd");
            
              Logger.log(newDate);
            }

            在这个例子中,我们首先创建一个 Date 对象来表示当前日期。然后,我们使用 setDate() 方法从当前日期减去 5 天。最后,我们使用 Utilities.formatDate() 方法格式化新日期,并使用 Logger.log() 方法将其记录到控制台。

            您可以修改 subtractDays 变量以从日期中减去不同的天数,或者您可以使用不同的日期对象作为开始。

            【讨论】:

              猜你喜欢
              • 2013-12-02
              • 2010-10-01
              • 1970-01-01
              • 2021-05-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多