Дата находится между двумя другими датами

#javascript #datetime #google-apps-script #google-sheets

Вопрос:

Я получаю значение() с листа с датой вызова = 29/08/2021 09:30:00

Я получаю две другие даты из формы : от фромдта и Тодта

Я хочу проверить, находится ли дата звонка между 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 amp;amp; vA[k][0].getTime() >= fromdt.getTime() amp;amp; vA[k][0].getTime() <= todt.getTime()){
//do something
}
}

 

Я хочу только сравнить даты. Я хочу не обращать внимания на время.

Приведенный выше код не может отображать соответствующие записи.

Комментарии:

1. Как вы запускаете эту функцию? Также, пожалуйста, добавьте более подробную информацию, например, некоторые примеры входных данных и ожидаемые результаты.

2. Вы пытались ввести в консоль один из журналов xx.getTime()? Или еще лучше… отладчик?

3. Вы должны научиться использовать объект события. Вы не знаете, как прочитать строку в электронной таблице с помощью вызова функции, потому что все эти значения уже находятся в e.values или e.namedvalues

4. Если вы хотите сравнить их численно, попробуйте получить их значения следующим образом: let fromdatevvalue = new Date(e.values[2]).valueOf(); Вы можете использовать valueOf() или getTime() для численного сравнения дат.

Ответ №1:

Я проверил часовой пояс на листе и в сценарии (переключившись на устаревший редактор). И то, и другое-одно и то же.

только постоянная дата = новая дата(дата и время.toISOString().срез(0,10))

Не получилось. В результате были получены данные за предыдущий день.

Затем я попытался с

const fromdt = новая дата(lvvals[0][1].Количество часов(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] amp;amp; sltdt.getTime() >= fromdt.getTime() amp;amp; sltdt.getTime() <= todt.getTime()){
     // do something
    }
  }
}
 

Ответ №2:

чтобы избавиться от части времени, вы можете использовать

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

а затем сравните значения времени получения (). Будьте осторожны с часовыми поясами, убедитесь, что часовой пояс вашего скрипта (определенный в appsscript.json) совпадает с часовым поясом электронной таблицы (определенным в файле меню «Листы» > «Настройки»>).

Комментарии:

1. toISOString возвращает значения UTC, которые затем анализируются конструктором как локальные. Гораздо лучше использовать setHours : date.setHours(0,0,0,0) . 😉

2. Спасибо @RobG. Сетхурс работал. На самом деле я уже пробовал это раньше, но потерпел неудачу. Теперь это работает

Ответ №3:

Если вам нужно просто проанализировать и сравнить даты в этом формате, быстрое и грязное решение находится здесь:

 // 'DD/MM/YYYY hh:mm:ss' --> 'YYYYMMDD'
const parse_date = d => d.replace(/(dd)/(dd)/(d ). /, '$3$2$1')
const is_between = c => (c > fromdt) amp;amp; (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 

Но лучше всего использовать объект данных, учитывать часовые пояса и т. Д.