2012-06-24 67 views
11

Cách tốt nhất để so sánh hai ngày là gì?So sánh hai ngày Google apps script

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

Tôi thấy tùy chọn .toString() nhưng dường như chỉ hoạt động đối với toán tử == hoặc ===.

Mọi thông tin rõ ràng về vấn đề này?

+0

nó phụ thuộc NHỮNG GÌ bạn muốn so sánh. Còn bạn muốn so sánh ngày nào? – mzimmerman

Trả lời

3

Các đối tượng ngày có thể được so sánh giống như bất kỳ biến nào khác. Điều khó khăn duy nhất là nếu bạn cần phải so sánh hai ngày trong cùng một ngày ví dụ và mong đợi để có được ngày A = ngày B, trong trường hợp này bạn có một vấn đề kể từ ngày cũng bao gồm giờ và phút (và giây + mili giây)! (đó là lý do tại sao tôi đề nghị sử dụng các chuỗi để kiểm tra sự bình đẳng trong bài viết mà bạn đề cập đến). Điều bạn có thể làm là đặt giờ, phút, giây và mili giây thành 0 trong cả hai biến để so sánh chỉ xảy ra vào ngày, tháng, năm. Xem w3schools date reference page để xem cách thực hiện điều đó.

Một khả năng khác sẽ được chuyển đổi cả ngày để dây sử dụng Utilities.formatDate() và chơi với substrings() để có được dữ liệu bạn cần, nhưng tôi đoán đây không phải là một cách rất thanh lịch để tiến hành ;-)

18

Đối tượng Date có Phương pháp valueOf trả về số mili giây kể từ nửa đêm 1970-01-01. Bạn có thể sử dụng nó để so sánh ngày tháng. Một cái gì đó như

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

Làm thế nào để bạn biết điều này? Loại nào (từ thư viện nào) là Ngày? Bạn có thể liên kết đến tài liệu của nó không? – dinosaur

+0

@dinosaur, tôi biết điều đó bằng cách thực thi mã tương tự với 'var d0 = new Date (0); var d1 = ngày mới (1); var str0 = d0.toISOString(); var str1 = d1.toISOString(); '. Ngay sau khi nó được thực thi, str0 có giá trị '1970-01-01T00: 00: 00.000Z' và str1 có' 1970-01-01T00: 00: 00.001Z'. Mã này được thực hiện trong môi trường GAS. Tôi cho rằng GAS không có tài liệu cho Ngày và các lớp cơ sở khác được thừa hưởng từ JS. Theo cách tương tự, người ta không thể tìm thấy bất kỳ tham chiếu đến lớp String trong tài liệu GAS. – megabyte1024

+0

tháng javascript bắt đầu bằng 0, chỉ bị kẹt với nó trong một thời gian ... –

9

Ai đó gửi một này khi trở lại, tôi thấy nó rất hữu ích

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

tôi đã làm một công việc ít arround, không quá quyến rũ nhưng có vẻ như để phục vụ.

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

Tôi cũng sẽ xem các câu trả lời khác và cung cấp cho câu trả lời.

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

Chà, tôi đến trễ đây. Tôi tìm thấy nó dễ dàng nhất để chuyển đổi ngày thành số nguyên Ngày của năm. Vì vậy, ngày 01 tháng 1 sẽ là 1, 01 tháng 2 sẽ là 32 vv

Đây là kịch bản:

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

Nếu bạn đang grabbing một giá trị từ bảng tính của bạn, chỉ cần đặt giá trị vào ngày mới():

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