精準年月問題 |
答題得分者是:Miles
|
mirage
初階會員 發表:40 回覆:101 積分:28 註冊:2004-01-05 發送簡訊給我 |
|
yachanga
資深會員 發表:24 回覆:335 積分:296 註冊:2003-09-27 發送簡訊給我 |
|
mirage
初階會員 發表:40 回覆:101 積分:28 註冊:2004-01-05 發送簡訊給我 |
引言: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=47825 http://delphi.ktop.com.tw/topic.php?topic_id=47153感謝yachanga先進: 但上述內的聯結都是bcb,我還未學bcb啊;另一篇: DecodeDate(TDate(Total),y,m,d); y-1900=年數 m-1 =月數 d =天數 亦不是精準的月數,會產生誤差,引言: 請問先進們: 1.yymm1:='91/01'; ==>請問:如何算出離今天實際共幾月. 2.yymmdd1:'91/02/15'; ==>請問:如何算出離今天實際共幾月. 謝謝!~悠遊法國號~ |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
mirage 你好 這個問題看似簡單,其實存在著諸多觀點上的差異,如一個月以幾天計,若以30天算,那一年又是幾天呢?是365天還是360天,另外潤年二月29天及28天的差異及每月天數有30及31天的問題,若要算的精細則還要考慮從那一天開始算起,不滿一個月的部份如何認定....以下則是更精準的計算方式 D1,D2 : TDateTime; //開始計算日期,目標日期 DecodeDate(D1,y1,m1,d1);
DecodeDate(D2,y2,m2,d2);
Result := (D2-D1)*12 (m2-m1) ;
Delta := d2-d1 1 ;
Case Delta Of
-31..-16: Result := Result -1 ; // 以15天為基準 自行認定後調整
-15..15 : Result := Result 0 ; // 此行可省略
16..31 : Result := Result 1 ;
End; 發表人 - chance36 於 2004/04/09 17:25:29
|
mirage
初階會員 發表:40 回覆:101 積分:28 註冊:2004-01-05 發送簡訊給我 |
引言: mirage 你好 這個問題看似簡單,其實存在著諸多觀點上的差異,如一個月以幾天計,若以30天算,那一年又是幾天呢?是365天還是360天,另外潤年二月29天及28天的差異及每月天數有30及31天的問題,若要算的精細則還要考慮從那一天開始算起,不滿一個月的部份如何認定....以下則是更精準的計算方式 D1,D2 : TDateTime; //開始計算日期,目標日期 DecodeDate(D1,y1,m1,d1); DecodeDate(D2,y2,m2,d2); Result := (D2-D1)*12 (m2-m1) ; Delta := d2-d1 1 ; Case Delta Of -31..-16: Result := Result -1 ; // 以15天為基準 自行認定後調整 -15..15 : Result := Result 0 ; // 此行可省略 16..31 : Result := Result 1 ; End; 發表人 - chance36 於 2004/04/09 17:25:29請問先進: DecodeDate(D1,y1,m1,d1); ===>是指d1的 y1,m1,d1嗎?要宣告何種變數? Delta : 要宣告何種變數? 小弟學淺,能否寫明白一點. 謝謝! |
shieh2700
高階會員 發表:0 回覆:127 積分:100 註冊:2002-06-13 發送簡訊給我 |
比較模糊(直覺)的方式
function CalMon( Date1, Date2 : TDate ) : integer; var Y,M,D : word; YY,MM : word; begin DecodeDate( Date1, Y, M, D ); DecodeDate( Date2, YY, MM, D ); result := ((YY-Y)*12) (MM-M) end; D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 D1 := StrToDate( '2004/04/30' ); D2 := StrToDate( '2003/04/01' ); i := CalMon( D1, D2 ); // i = -12 |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
mirage 你好 Date1,Date2 : TDateTime; //開始計算日期,目標日期
Delta : Integer ;
y1,m1,d1,y2,m2,d2 : integer; DecodeDate(Date1,y1,m1,d1);
DecodeDate(Date2,y2,m2,d2);
Result := (d2-d1)*12 (m2-m1) ;
Delta := d2-d1 1 ; // 差異天數
Case Delta Of //
-31..-16: Result := Result -1 ; // 以15天為基準 自行認定後調整
-15..15 : Result := Result 0 ; // 此行可省略
16..31 : Result := Result 1 ;
End; 發表人 - chance36 於 2004/04/09 18:00:08
|
mirage
初階會員 發表:40 回覆:101 積分:28 註冊:2004-01-05 發送簡訊給我 |
引言: 比較模糊(直覺)的方式您好: D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 但實際只有5個多月,不知哪要改.function CalMon( Date1, Date2 : TDate ) : integer; var Y,M,D : word; YY,MM : word; begin DecodeDate( Date1, Y, M, D ); DecodeDate( Date2, YY, MM, D ); result := ((YY-Y)*12) (MM-M) end; D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 D1 := StrToDate( '2004/04/30' ); D2 := StrToDate( '2003/04/01' ); i := CalMon( D1, D2 ); // i = -12 |
shieh2700
高階會員 發表:0 回覆:127 積分:100 註冊:2002-06-13 發送簡訊給我 |
引言:此函式精度只到月而已, 就算兩個日期只差一天(跨月份), 結果也是差一個月(不同月份) 你要的精度是多少? 月? 日? 時? 分? 秒?引言: 比較模糊(直覺)的方式您好: D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 但實際只有5個多月,不知哪要改.function CalMon( Date1, Date2 : TDate ) : integer; var Y,M,D : word; YY,MM : word; begin DecodeDate( Date1, Y, M, D ); DecodeDate( Date2, YY, MM, D ); result := ((YY-Y)*12) (MM-M) end; D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 D1 := StrToDate( '2004/04/30' ); D2 := StrToDate( '2003/04/01' ); i := CalMon( D1, D2 ); // i = -12 |
mirage
初階會員 發表:40 回覆:101 積分:28 註冊:2004-01-05 發送簡訊給我 |
引言: mirage 你好 Date1,Date2 : TDateTime; //開始計算日期,目標日期 Delta : Integer ; y1,m1,d1,y2,m2,d2 : integer; DecodeDate(Date1,y1,m1,d1); DecodeDate(Date2,y2,m2,d2); Result := (d2-d1)*12 (m2-m1) ; Delta := d2-d1 1 ; // 差異天數 Case Delta Of // -31..-16: Result := Result -1 ; // 以15天為基準 自行認定後調整 -15..15 : Result := Result 0 ; // 此行可省略 16..31 : Result := Result 1 ; End; 發表人 - chance36 於 2004/04/09 18:00:08您好: 上述只能執行到: DecodeDate(Date1,y1, 請問不知要改哪.. |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
function CalMon( Date1, Date2 : TDate ) : integer; var Delta : Integer ; y1,m1,d1,y2,m2,d2 : word; begin DecodeDate(Date1,y1,m1,d1); DecodeDate(Date2,y2,m2,d2); Result := (d2-d1)*12 (m2-m1) ; Delta := d2-d1 1 ; // 差異天數 Case Delta Of // -31..-16: Result := Result -1 ; // 以15天為基準 自行認定後調整 -15..15 : Result := Result 0 ; // 此行可省略 16..31 : Result := Result 1 ; End; end; D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 = 5個月又25天發表人 - chance36 於 2004/04/09 18:32:21 |
mirage
初階會員 發表:40 回覆:101 積分:28 註冊:2004-01-05 發送簡訊給我 |
引言:您好: 我想要的並不要準到分秒,如: D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 ====> 實際月份是 i:=5 D1 := StrToDate( '2004/04/30' ); D2 := StrToDate( '2003/04/01' ); i := CalMon( D1, D2 ); // i = -12 ====> 實際月份是 i:=11引言:此函式精度只到月而已, 就算兩個日期只差一天(跨月份), 結果也是差一個月(不同月份) 你要的精度是多少? 月? 日? 時? 分? 秒?引言: 比較模糊(直覺)的方式您好: D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 但實際只有5個多月,不知哪要改.function CalMon( Date1, Date2 : TDate ) : integer; var Y,M,D : word; YY,MM : word; begin DecodeDate( Date1, Y, M, D ); DecodeDate( Date2, YY, MM, D ); result := ((YY-Y)*12) (MM-M) end; D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 D1 := StrToDate( '2004/04/30' ); D2 := StrToDate( '2003/04/01' ); i := CalMon( D1, D2 ); // i = -12 |
mirage
初階會員 發表:40 回覆:101 積分:28 註冊:2004-01-05 發送簡訊給我 |
引言:您好: 上述也只能執行到: DecodeDate(Date1,y1, 錯誤訊息:是參數宣告要一致, 請問不知要改哪..function CalMon( Date1, Date2 : TDate ) : integer; var Delta : Integer ; y1,m1,d1,y2,m2,d2 : integer; begin DecodeDate(Date1,y1,m1,d1); DecodeDate(Date2,y2,m2,d2); Result := (d2-d1)*12 (m2-m1) ; Delta := d2-d1 1 ; // 差異天數 Case Delta Of // -31..-16: Result := Result -1 ; // 以15天為基準 自行認定後調整 -15..15 : Result := Result 0 ; // 此行可省略 16..31 : Result := Result 1 ; End; end; D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 = 5個月又25天 |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
|
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
Hi mirage 您好, 要不要直接使用Delphi內附的MonthBetween函數
Uses DateUtils;
var yymm1, yymmdd1 : String; begin yymm1 := '2002/01/01'; yymmdd1 := '2002/02/15'; Label1.Caption := IntToStr(MonthsBetween(Now, StrToDate(yymm1))); Label2.Caption := IntToStr(MonthsBetween(Now, StrToDate(yymmdd1))); end;我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2004/04/09 18:40:16
------
我不是高手, 高手是正在銀幕前微笑的人. |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
|
mirage
初階會員 發表:40 回覆:101 積分:28 註冊:2004-01-05 發送簡訊給我 |
引言: Hi mirage 您好, 要不要直接使用Delphi內附的MonthBetween函數 Uses DateUtils;感謝您的指教.... 心中無限感激.....var yymm1, yymmdd1 : String; begin yymm1 := '2002/01/01'; yymmdd1 := '2002/02/15'; Label1.Caption := IntToStr(MonthsBetween(Now, StrToDate(yymm1))); Label2.Caption := IntToStr(MonthsBetween(Now, StrToDate(yymmdd1))); end;我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2004/04/09 18:40:16 |
mirage
初階會員 發表:40 回覆:101 積分:28 註冊:2004-01-05 發送簡訊給我 |
引言: Hi mirage 您好, 要不要直接使用Delphi內附的MonthBetween函數 Uses DateUtils;您好: 我將日期改為 var yymm1, yymmdd1 : String; begin yymm1 := '2002/01'; yymmdd1 := '2003/02'; Label1.Caption := IntToStr(MonthsBetween(Now, StrToDate(yymm1))); Label2.Caption := IntToStr(MonthsBetween(Now, StrToDate(yymmdd1))); end; 編譯出現'2002/01'不是有效日期,請問要如何修改.. 謝謝!var yymm1, yymmdd1 : String; begin yymm1 := '2002/01/01'; yymmdd1 := '2002/02/15'; Label1.Caption := IntToStr(MonthsBetween(Now, StrToDate(yymm1))); Label2.Caption := IntToStr(MonthsBetween(Now, StrToDate(yymmdd1))); end;我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2004/04/09 18:40:16 |
suhuan
一般會員 發表:2 回覆:1 積分:0 註冊:2005-01-04 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |