iT邦幫忙

0

如何計算不包含特定月份的日期區間天數

最近我想在網頁上製作一份能夠傳入起始日期及結束日期的電費試算表
請問如果要計算夏月日期天數或是不含夏月日期的天數該怎麼寫呢?
例如:

$scope.date1 =  new Date("2020-05-15"); 
$scope.date2 =   new Date("2020-07-14")
$scope.date3 = ( $scope.date2 - $scope.date1)  / 1000 / 60 / 60 / 24+1;

夏月6/1~9/30
用以上的結果可以date3會等於61天 我該如何算出在夏月日期的天數44天或是普通日期的17天呢?
更新目前的寫法:

    $scope.fm =  new Date("2019-05-15"); 
    $scope.to =   new Date("2019-07-14")
	$scope.all = ( $scope.to - $scope.fm)  / 1000 / 60 / 60 / 24+1;
	$scope.sfm =   new Date("2019-06-01")
	$scope.sto=new Date("2019-09-30")
	if($scope.fm<$scope.sfm&&$scope.to>$scope.sto){
		$scope.sum=(($scope.to - $scope.fm)-($scope.to - $scope.sto)-($scope.sfm - $scope.fm)) / 1000 / 60 / 60 / 24+1
	}
	if($scope.fm<$scope.sfm&&$scope.to<$scope.sto){
        $scope.sum=(($scope.to - $scope.fm)-($scope.sfm-$scope.fm)) / 1000 / 60 / 60 / 24+1
	}
	if($scope.fm>$scope.sfm&&$scope.to>$scope.sto){
		$scope.sum=(($scope.to - $scope.fm)-($scope.to-$scope.sto)) / 1000 / 60 / 60 / 24+1
	}
	if($scope.fm>$scope.sfm&&$scope.to<$scope.sto){
		$scope.sum=( $scope.to - $scope.fm)  / 1000 / 60 / 60 / 24+1;
	}
goodnight iT邦研究生 3 級 ‧ 2020-07-24 16:00:05 檢舉
我的想法比較簡單, 設定一個變動欄位記錄你要排除的日期區間, 一般是在 sql command 處理
1
archer9080
iT邦新手 4 級 ‧ 2020-07-24 15:28:58
最佳解答

相較於計算,如何判斷起訖在不在區間內應該比較麻煩一些些(?
假設您的判斷都已完成、知道日期區間又能算出起訖總天數
依樣畫葫蘆的方式應該就可以了

假設起訖皆在區間外:
全部天數 - (起始日期 ~ 區間頭一天 的天數) - (訖日日期 ~ 區間最後一天 的天數) = 夏月電費範圍

假設只有起始日在區間外:
全部天數 - (起始日期 ~ 區間頭一天 的天數) - (區間最後一天 ~ 訖日日期 的天數) = 夏月電費範圍

假設只有訖日在區間外:
全部天數 - (區間頭一天 ~ 起始日期 的天數) - (訖日日期 ~ 區間最後一天 的天數) = 夏月電費範圍

如果回答及理解有誤再輕鞭一些 :D

amicanon9 iT邦新手 5 級 ‧ 2020-07-24 15:34:26 檢舉

感謝回答 對我很有幫助~

0
浩瀚星空
iT邦超人 1 級 ‧ 2020-07-24 14:37:30

不幫你寫,只告訴你理論。

A~B = 實際天數範圍
O~P = 夏日範圍

ABOP 夏日=0 一般=B-A(全)
AOBP 夏日=B-O 一般=O-A
AOPB 夏日=OP(全) 一般=(O-A)+(B-P)
OAPB 夏日=P-A 一般=B-P
OPAB 夏日=0 一般=B-A(全)

0
淺水員
iT邦研究生 4 級 ‧ 2020-07-24 21:37:05

我的想法大概這樣,這應該可以計算更複雜的狀況

    let arr=[
        {dat: 計算起始日期, tpy: "start"},
        {dat: 計算結束日期, tpy: "end"},
        {dat: 夏日電費起始, tpy: "priceChange", val: 夏日電費},
        {dat: 夏日電費結束+1天, tpy: "priceChange", val: 平日電費}
    ];
    arr.sortByDat(); //arr 依照 dat去排序
    let price=平日電費,
        susm=0,
        lastDate=false;
    for(data in arr) {
        //依據收到的 data.typ 計算,更新 sum, price, lastDate
    }
1
japhenchen
iT邦高手 1 級 ‧ 2020-07-27 11:37:00

.........回錯.....等人刪

我要發表回答

立即登入回答