【问题标题】:Date is between two other dates日期在另外两个日期之间
【发布时间】:2021-08-29 17:27:48
【问题描述】:

我从日期为 calldate = 29/08/2021 09:30:00 的工作表中获取值()

我从表格中得到另外两个日期:fromdt 和 todt

我想检查 calldate 是否在 fromdt 和 todt 之间

我试过了

function onFormSumbit(e) {
  //Timestamp   1Name   1From Date  3.From Time 4To Date    5To Time    6Reason                     
  var name = e.source.getActiveSheet().getRange(e.range.rowStart,2).getValue();
  var fromdt = e.source.getActiveSheet().getRange(e.range.rowStart,3).getValue();
  var fromtime = e.source.getActiveSheet().getRange(e.range.rowStart,4).getValue();
  var todt = e.source.getActiveSheet().getRange(e.range.rowStart,5).getValue();
  var totime = e.source.getActiveSheet().getRange(e.range.rowStart,6).getValue();
  var reason = e.source.getActiveSheet().getRange(e.range.rowStart,7).getValue();
  if ( todt=="") {todt=fromdt} ;
  if ( fromtime=="") {fromtime=9}   ;
  if ( totime=="") {totime=19} ;
  var empss = SpreadsheetApp.openById("xxx"); // service calls 
  var sltsht = empss.getSheetByName("Slots");
  var vA =sltsht.getDataRange().getValues();//first column is a date with some time
  for (k=1;k<vA.length;k++){
     if (vA[k][3]==name && vA[k][0].getTime() >= fromdt.getTime() && vA[k][0].getTime() <= todt.getTime()){
//do something
}
}

我只想比较日期。我想忽略时间。

以上代码无法显示匹配记录。

【问题讨论】:

  • 你是如何运行这个函数的?还请添加更多详细信息,例如一些示例输入数据和预期结果。
  • 您是否尝试过控制台记录 xx.getTime() 之一?或者更好……调试器?
  • 你应该学习如何使用事件对象。您不知道如何通过函数调用读取电子表格中的行,因为所有这些值都已经在 e.values 或 e.namedvalues 中
  • 如果您希望以数字方式比较它们,请尝试像这样获取它们的值:let fromdatevvalue = new Date(e.values[2]).valueOf(); 您可以使用 valueOf() 或 getTime() 以数字方式比较日期。

标签: javascript datetime google-apps-script google-sheets


【解决方案1】:

我检查了工作表和脚本中的时区(通过切换到旧版编辑器)。两者都是一样的。

const dateOnly = new Date(dateAndTime.toISOString().slice(0,10))

没有用。结果是获取了前一天的数据。

然后我尝试了

const fromdt = new Date(lvvals[0][1].setHours(0,0,0,0));

效果很好。

谢谢

我在下面给出最终代码

function test(){
  var ss=SpreadsheetApp.getActive();
  var lvvals = ss.getActiveSheet().getRange(12,2 , 1, 7  ).getValues();
  //const fromdt = new Date(lvvals[0][1].toISOString().slice(0,10)); //returned the previous date
  const fromdt = new Date(lvvals[0][1].setHours(0,0,0,0)); // worked correctly
  if ( lvvals[0][3]=="") {lvvals[0][3]=lvvals[0][1]} ;
  //const todt = new Date(lvvals[0][3].toISOString().slice(0,10));
  const todt = new Date(lvvals[0][3].setHours(0,0,0,0));
  var empss = SpreadsheetApp.openById("xxx"); // service calls 
  var sltsht = empss.getSheetByName("Slots");
  var vA =sltsht.getDataRange().getValues();
  for (k=1;k<vA.length;k++){
     //sltdt = new Date(vA[k][0].toISOString().slice(0,10));
     sltdt = new Date(vA[k][0].setHours(0,0,0,0));
     if (vA[k][3]==lvvals[0][0] && sltdt.getTime() >= fromdt.getTime() && sltdt.getTime() <= todt.getTime()){
     // do something
    }
  }
}

【讨论】:

    【解决方案2】:

    要摆脱时间部分,你可以使用

    const dateOnly = new Date(dateAndTime.toISOString().slice(0,10))
    

    然后比较 getTime() 值。请注意时区,确保您的脚本时区(在 appsscript.json 中定义)与电子表格时区(在工作表菜单 File>Settings 中定义)匹配

    【讨论】:

    • toISOString 返回 UTC 值,然后构造函数将其解析为本地值。最好使用 setHoursdate.setHours(0,0,0,0)。 ;-)
    • 谢谢@RobG。 setHours 工作。其实我之前试过了,但是失败了。现在它正在工作
    【解决方案3】:

    如果您只需要解析和比较这种格式的日期,那么快速而肮脏的解决方案就在这里:

    // 'DD/MM/YYYY hh:mm:ss' --> 'YYYYMMDD'
    const parse_date = d => d.replace(/(\d\d)\/(\d\d)\/(\d+).+/, '$3$2$1')
    const is_between = c => (c > fromdt) && (c < todt);
    
    var fromdt   = parse_date('28/08/2021 09:30:00');
    var todt     = parse_date('30/08/2021 09:30:02');
    
    var calldate = parse_date('29/08/2021 09:30:01');
    console.log(is_between(calldate)); // true
    
    var calldate = parse_date('27/08/2021 09:35:01');
    console.log(is_between(calldate)); // false

    但最佳做法是使用Data object,考虑时区等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      相关资源
      最近更新 更多