線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5174
推到 Plurk!
推到 Facebook!

DateTimePicker 與 日期 Date 相減 問題

答題得分者是:老大仔
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-04-10 14:37:55 IP:111.251.xxx.xxx 未訂閱
我設定兩個 DateTimePicker 然後要算出兩個日期之間相差幾天。
本來應該是 DateTimePicker1 - DateTimePicker2 就可以得到相差天數。
或者用 DaysBetween 需要 #include
但是卻出現在初始化的時候,如果我使用 Now() 當我用 2011/12/15 - 2011/12/14 傳回的居然是0
改用 DTP1->DateTime = StrToDate(FormatDateTime("yyyy/mm/dd",Now()-1));
就得到正確的答案1
我有想過可能是2012/02/29的問題,但是看起來不是?

其中函數我用的是文字轉日期,也想過會不會是直接文字轉日期(SDay,Eday)與DateTimePicker Date (D1,D2)不同所造成的。
會不會是這個問題?有人知道的話請指教一下喔。

附件是函數要計算的日期示意圖
[code cpp]
//初始化
//DTP1->DateTime = Now(); //使用Now 會讓日期加減少一天 但是轉成文字後就不會
//DTP2->DateTime = Now();
DTP1->DateTime = StrToDate(FormatDateTime("yyyy/mm/dd",Now()-1)); //此方法可以解決,但是很怪異,有可能跟2012/02/29有關
DTP2->DateTime = StrToDate(FormatDateTime("yyyy/mm/dd",Now()));

//函數
int __fastcall TForm1::CalDayCount(TDate D1, TDate D2, TDate SDay, TDate EDay)
{
int TDay=0;
if(D1>SDay && D1<=EDay) //1
{
TDay = EDay - D1;
//TDay = 1; //*******?????
//Memo1->Lines->Add("D1: " FormatDateTime("yyyy-mm-dd",D1));
//Memo1->Lines->Add("D2: " FormatDateTime("yyyy-mm-dd",D2));
//Memo1->Lines->Add("SDay: " FormatDateTime("yyyy-mm-dd",SDay));
//Memo1->Lines->Add("Eday: " FormatDateTime("yyyy-mm-dd",EDay));
//Memo1->Lines->Add("1: " IntToStr(TDay));
}else if(D2>=SDay && D2 TDay = D2 - SDay;
Memo1->Lines->Add("2: " IntToStr(TDay));
}else if(D1<=SDay && D2>=EDay) { //3
TDay = EDay - SDay;
Memo1->Lines->Add("3: " IntToStr(TDay));
}else if(D1>SDay && D2 TDay = D2 - D1;
Memo1->Lines->Add("4: " IntToStr(TDay));
}else{
TDay = 0;
Memo1->Lines->Add("5: " IntToStr(TDay));
}
return TDay 1;
}
//---------------------------------------------------------------------------
[/code]

附加檔案:4f83d5435aa08_Dates.JPG
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-04-11 09:34:17 IP:59.120.xxx.xxx 未訂閱
Help的說明如下:
---
DaysBetween counts only whole days.
Thus, DaysBetween reports the difference between Dec 31, 1999 11:59 PM and Jan 1, 2000 11:58 PM as 0 because the difference is one minute short of an entire day.
---
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-04-11 09:50:39 IP:59.120.xxx.xxx 未訂閱
 然後我又用了另一語法測試(Delphi)
是有變正確了...
ShowMessage(IntToStr(Round(DateTimePicker1.Date - DateTimePicker2.Date)));
編輯記錄
老大仔 重新編輯於 2012-04-10 20:01:52, 註解 無‧
老大仔 重新編輯於 2012-04-10 20:02:09, 註解 無‧
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-04-13 09:25:30 IP:140.114.xxx.xxx 未訂閱
請問這個現象是由哪邊引起的,
因為會影響到以後初始設定需要用哪個方法,日期才會正確

===================引 用 老大仔 文 章===================
然後我又用了另一語法測試(Delphi)
是有變正確了...
ShowMessage(IntToStr(Round(DateTimePicker1.Date - DateTimePicker2.Date)));
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-04-13 09:54:34 IP:59.120.xxx.xxx 未訂閱
根據Help的說法
是分鐘數也有算入的樣子
假如
Day1: 2012/4/12 09:42:47
DaysBetween(Day1, Day2)
那麼就會算成是1天
假如
Day1: 2012/4/42:47
Day2: 2012/4/43:47
DaysBetween(Day1, Day2)
那麼就會算成是0天
假如
Day1: 2012/4/42:47
Day2: 2012/4/41:47
DaysBetween(Day1, Day2)
那麼就會算成是1天
===================引 用 juneo 文 章===================
請問這個現象是由哪邊引起的,
因為會影響到以後初始設定需要用哪個方法,日期才會正確

===================引 用 老大仔 文 章===================
然後我又用了另一語法測試(Delphi)
是有變正確了...
ShowMessage(IntToStr(Round(DateTimePicker1.Date - DateTimePicker2.Date)));
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-04-13 10:05:14 IP:59.120.xxx.xxx 未訂閱
 剛剛又測試了一下(Delphi環境):
ShowMessage(IntTostr(DaysBetween(StrToDate('2012/4/13'), StrToDate('2012/4/12'))));
回傳的差是1天
ShowMessage(IntTostr(DaysBetween(DateTimePicker1.Date, DateTimePicker2.Date)));
回傳的差是0天
所以我在"猜"...
它在轉換時"應該"有把Time算進去
所以會有誤差
解決方式可能是先將日期取出來放到變數中再做DaysBetween....
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-04-19 18:34:32 IP:111.251.xxx.xxx 未訂閱
我再猜也是因為Time 的問題,
所以當我轉成字串的時候Time可能被格式化成為預設值,
因此計算上才正確。

暫時以這個來想吧!!
系統時間:2024-12-04 17:03:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!