2014-01-19 58 views
1

我使用以下函數查找選定日期的季度的最後一天。 現在我只是添加12 * Date.WEEK,但不完全是我想要的。 請問你有看和建議如何找到季度的最後一天?我想要date2的最後一天。選定季度的最後一天

function catcalc(cal) { 
var date = cal.date; 
    var time = date.getTime(); 
    var field = document.getElementById("x_Bis"); 
    if (field == cal.params.inputField) {   
     field = document.getElementById("x_Von"); 
     time -= 12*Date.WEEK; // substract one week 
    } else {       
    time += 12*Date.WEEK; // add one week 6*Date.DAY 
    }           
    var date2 = new Date(time);        
    field.value = date2.print("%d.%m.%Y"); 

我應該保留函數結構並保留變量的名稱。有兩個日曆字段相互關聯。用戶可以從日曆中選擇任意日期(不需要時鐘)。該功能來自http://cimanet.uoc.edu/logica/v2/lib/jscalendar-1.0/doc/html/reference.html

+1

爲什麼計算?如果日期<3月31日,最後一天= 3月31日,否則如果<6月30日,最後一天= 6月30日等等 – mplungjan

+0

你的意思只是檢查日期,並把一些if或switch?但是怎樣才能存儲最後一天的時間? – user727198

回答

1

Live Demo

function getQ(date) { 
    var t=new Date(date.getTime()),year=t.getFullYear() // copy 
    t.setHours(0,0,0,0); // normalise to not get boundary errors 
    // note months start at 0 in JS 
    var q1 = new Date(year,2,31), 
     q2 = new Date(year,5,30), 
     q3 = new Date(year,8,30), 
     q4 = new Date(year,11,31); 
    if (t<=q1) return q1; 
    if (t<=q2) return q2; 
    if (t<=q3) return q3; 
    if (t<=q4) return q4; 
} 
getQ(new Date()); // today will return 31st of March 

在你的代碼,我猜你可以使用

function catcalc(cal) { 
    var date = cal.date; 
    var field = document.getElementById("x_Bis"); 
    if (field == cal.params.inputField) {   
    field = document.getElementById("x_Von"); 
    }           
    var date2 = getQ(date); 
    field.value = date2.print("%d.%m.%Y"); 
} 
+0

對於最初的想法+1,但這是多麼醜陋的代碼!除此之外,是否需要'setHours()'和'getTime()'? – Pavlo

+1

設定的時間是正常化,得到的時間可能不是。在使用map和其他你可能會覺得更優雅的東西之前,請記住op的noob狀態。 – mplungjan

+0

如果你指的是OP的低代表,它可能不是這種情況(他可能在另一種語言中有幾十年的編程經驗)。即使它是''map()'和'filter()'是每個JS開發人員必須知道的常用方法,越快越好。 – Pavlo

1

擴大@mplungjan提案(和使用日期時照看的JavaScript的沉默)。我將使用方法鏈接,因此每個下一個方法都將根據之前返回的方法進行操作。

function getLastDayOfQuarter(date) { 
    var year = date.getFullYear(); 
    var quarterEndings = [[3, 31], [6, 30], [9, 30], [12, 31]]; 

    var toDateObj = function (dates) { 
    return new Date(year, dates[0] - 1, dates[1]); 
    }; 

    var isBeforeEndDate = function (endDate) { 
    return endDate >= date; 
    } 

    date.setHours(0, 0, 0, 0); 

    return quarterEndings 
    .map(toDateObj) 
    .filter(isBeforeEndDate)[0]; 
} 

getLastDayOfQuarter(new Date()).toDateString(); // "Mon Mar 31 2014" 

演示:http://jsbin.com/eZoliye/1/edit?js,console

+0

你叫我的代碼醜陋?這對任何新來JS的人來說都是不可讀的。 – mplungjan

+0

@mplungjan你能更有建設性嗎?我想改進它。 – Pavlo

+0

我讓自己的代碼不笨拙,我真的必須多次閱讀你的代碼才能看到發生了什麼。它可能在框架中可以,但拋出地圖和過濾器,這是非常新的面對一個noob幾乎是邪惡的:) – mplungjan

相關問題