全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2759
推到 Plurk!
推到 Facebook!

精準年月問題

答題得分者是:Miles
mirage
初階會員


發表:40
回覆:101
積分:28
註冊:2004-01-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-09 13:39:21 IP:61.221.xxx.xxx 未訂閱
請問先進們: 1.yymm1:='91/01'; ==>請問:如何算出離今天實際共幾月. 2.yymmdd1:'91/02/15'; ==>請問:如何算出離今天實際共幾月. 謝謝! 發表人 - mirage 於 2004/04/09 14:32:01
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-09 14:08:22 IP:210.68.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=47825 http://delphi.ktop.com.tw/topic.php?topic_id=47153    
引言: 請問先進們: 1.yymm1:='91/01'; ==>請問:如何算出離今天實際共幾月. 2.yymmdd1:'91/02/15'; ==>請問:如何算出離今天實際共幾月. 謝謝!
~悠遊法國號~
mirage
初階會員


發表:40
回覆:101
積分:28
註冊:2004-01-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-09 14:28:29 IP:61.221.xxx.xxx 未訂閱
引言: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=47825 http://delphi.ktop.com.tw/topic.php?topic_id=47153
引言: 請問先進們: 1.yymm1:='91/01'; ==>請問:如何算出離今天實際共幾月. 2.yymmdd1:'91/02/15'; ==>請問:如何算出離今天實際共幾月. 謝謝!
~悠遊法國號~
感謝yachanga先進: 但上述內的聯結都是bcb,我還未學bcb啊;另一篇: DecodeDate(TDate(Total),y,m,d); y-1900=年數 m-1 =月數 d =天數 亦不是精準的月數,會產生誤差,
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-09 17:23:36 IP:211.20.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-09 17:46:52 IP:61.221.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-09 17:47:07 IP:61.216.xxx.xxx 未訂閱
比較模糊(直覺)的方式
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-09 17:56:23 IP:211.20.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-04-09 17:58:45 IP:61.221.xxx.xxx 未訂閱
引言: 比較模糊(直覺)的方式
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    
您好: D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 但實際只有5個多月,不知哪要改.
shieh2700
高階會員


發表:0
回覆:127
積分:100
註冊:2002-06-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-04-09 18:05:41 IP:61.216.xxx.xxx 未訂閱
引言:
引言: 比較模糊(直覺)的方式
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    
您好: D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 但實際只有5個多月,不知哪要改.
此函式精度只到月而已, 就算兩個日期只差一天(跨月份), 結果也是差一個月(不同月份) 你要的精度是多少? 月? 日? 時? 分? 秒?
mirage
初階會員


發表:40
回覆:101
積分:28
註冊:2004-01-05

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-04-09 18:07:39 IP:61.221.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-04-09 18:17:15 IP:211.20.xxx.xxx 未訂閱
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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-04-09 18:21:17 IP:61.221.xxx.xxx 未訂閱
引言:
引言:
引言: 比較模糊(直覺)的方式
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    
您好: D1 := StrToDate( '2003/10/15' ); D2 := StrToDate( '2004/04/10' ); i := CalMon( D1, D2 ); // i = 6 但實際只有5個多月,不知哪要改.
此函式精度只到月而已, 就算兩個日期只差一天(跨月份), 結果也是差一個月(不同月份) 你要的精度是多少? 月? 日? 時? 分? 秒?
您好: 我想要的並不要準到分秒,如: 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
mirage
初階會員


發表:40
回覆:101
積分:28
註冊:2004-01-05

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-04-09 18:27:42 IP:61.221.xxx.xxx 未訂閱
引言:
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天     
您好: 上述也只能執行到: DecodeDate(Date1,y1, 錯誤訊息:是參數宣告要一致, 請問不知要改哪..
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-04-09 18:34:21 IP:211.20.xxx.xxx 未訂閱
啊呀!!失誤了.....改成word ,   y1,m1,d1,y2,m2,d2 : word;
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-04-09 18:38:56 IP:218.160.xxx.xxx 未訂閱
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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-04-09 18:45:06 IP:211.20.xxx.xxx 未訂閱
對喔!大家都被提目[精準年月]搞混,其實只是要月份而已,使用內建函數,乾淨利落。
mirage
初階會員


發表:40
回覆:101
積分:28
註冊:2004-01-05

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-04-09 18:47:29 IP:61.221.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-04-10 15:28:13 IP:203.70.xxx.xxx 未訂閱
引言: 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
您好: 我將日期改為 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'不是有效日期,請問要如何修改.. 謝謝!
suhuan
一般會員


發表:2
回覆:1
積分:0
註冊:2005-01-04

發送簡訊給我
#19 引用回覆 回覆 發表時間:2007-09-03 14:57:14 IP:163.15.xxx.xxx 訂閱
我用Delphi5 , 沒有 DateUtils 這個dcu,怎麼辦
系統時間:2024-04-26 5:10:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!