2012-06-24 2 views
11

Что было бы лучшим способом для сравнить две даты?Сравните две даты Сценарий приложений Google

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(), но, похоже, работает только для оператора == или ===.

Что-нибудь ясное в этом вопросе?

+0

это зависит от того, что вы хотите сравнить. Как насчет даты, которую вы хотите сравнить? – mzimmerman

ответ

3

Объекты Date могут сравниваться так же, как и любые другие переменные. Единственное сложное дело в том, что если вам нужно сравнить две даты в тот же день, например, и ожидать получить дату A = дата B, в этом случае у вас есть проблема, так как даты также включают часы и минуты (и секунды + миллисекунды)! (поэтому я предложил использовать строки для проверки равенства в сообщении, на которое вы ссылаетесь). Что вы можете сделать, так это установить часы, минуты, секунды и миллисекунды на 0 в обеих переменных, чтобы сравнение происходило только в день, месяц, год. См. w3schools date reference page, чтобы узнать, как это сделать.

Другой возможностью было бы преобразовать обе даты в строки с помощью Utilities.formatDate() и играть с substrings(), чтобы получить данные, необходимые, но я предполагаю, что это не очень элегантный способ продолжить ;-)

18

Объект Date имеет valueOf, который возвращает миллисекунды с полуночи 1970-01-01. Вы можете использовать его для сравнения дат. Что-то вроде

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

Откуда вы это знаете? Какой тип (из какой библиотеки) Date? Вы можете ссылаться на свою документацию? – dinosaur

+0

@ динозавр, я знаю это, выполнив код, похожий на 'var d0 = new Date (0); var d1 = new Дата (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. Аналогичным образом нельзя найти ссылку на класс String в документации GAS. – megabyte1024

+0

javascript месяц начинается с 0, просто застрял с ним на некоторое время ... –

9

Кто-то отправил это некоторое время назад, я считаю, это очень полезно

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

Я сделал небольшую работу Arround, не так мила, но это, кажется, служить.

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

Я также проверю другие ответы и даю им вращение.

4
// 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); 
} 
3

Вау, я опаздываю здесь. Мне было проще всего преобразовать даты в целое число года. Так 1 января будет 1, 1 февраля будет 32 и т.д.

Вот этот скрипт:

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

Если вы захватывая значение из таблицы, просто поместить значение в новую дату():

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