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

拜託幫一下~用delphi7寫的萬年曆

尚未結案
mingood
一般會員


發表:2
回覆:11
積分:2
註冊:2005-03-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-28 21:57:47 IP:218.162.xxx.xxx 未訂閱
真ㄉ寫不出來捏~有誰能幫我一下~ 我找到ㄉ資料是要找一天當基準 然後算出與基準差幾天mod 7 餘0就是禮拜日,餘1禮拜一,... "年份能被4整除但不被100整除"以及"能被400整除"~這兩種為閏年 閏年2月29天~平年28天~所以閏年366天~平年365天 年跟月由使用者輸入~因該是用兩ㄍEDIT吧 我有找到一篇"n/a"大大ㄉ回應文 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=25433 先確定怎麼算日子就行, 每月有幾天就用大月小月,配合閏年檢查,譬如,(以下是虛擬碼) if month = 2 then if ((year mod 4 = 0) or (year mod 400 = 0)) and (year mod 100 != 0) then days := 29 else days := 28 end if else if (month = 4) or (month = 6) or (month = 9) or (month = 11) then days := 30 else days := 31 end if 然後,再借用2003年1月1日星期3當做基準, 2003年3月1日是星期幾? 答案是,經過上述if-else式子換算, 2003年1月有31天,2003年2月有28天,共為59天,59除7餘3, 所以2003年3月1日的星期數,是2003年1月1日的星期數加3(再除7餘6),為星期6. 知道這一天是星期6了,就很容易印出2003年3月1日的月曆. 有誰能夠幫我想一下QQ
boson
中階會員


發表:74
回覆:155
積分:85
註冊:2004-07-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-28 23:36:57 IP:218.174.xxx.xxx 未訂閱
如果可以使用 Delphi 已經寫好的函數, 就會方便得多了 uses DateUtils; DaysInAYear(2008) 得到 2008 年的日數 (366) DaysInAMonth(2008,2) 得到 2008 年 2 月的日數 (29) DayOfTheWeek(Date) 得到今天是星期幾 ?
mingood
一般會員


發表:2
回覆:11
積分:2
註冊:2005-03-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-28 23:42:32 IP:218.162.xxx.xxx 未訂閱
引言: 如果可以使用 Delphi 已經寫好的函數, 就會方便得多了 uses DateUtils; DaysInAYear(2008) 得到 2008 年的日數 (366) DaysInAMonth(2008,2) 得到 2008 年 2 月的日數 (29) DayOfTheWeek(Date) 得到今天是星期幾 ?
嗚嗚~偏偏他說要用程式算>"<
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-29 00:05:31 IP:61.62.xxx.xxx 未訂閱
首先,你先決定好要用誰做基準 例如你這裡是用 2003/1/1 星期三為例 現在是 2005/3/29 是星期幾呢? 只要算出今天跟 2003/1/1 隔幾天就行了 實際上有比較快的算法 已知一年有 365 天,365 除以 7 餘 1 可得知每隔一天,星期會加一,隔二年即加二 不過,閏年有 366 天,也就是星期會加二,不過,原本已經先加一了 所以你只要算出有幾個閏年,再算上去就行了 2005/1/1 ~ 2003/1/1 只有 2004 是閏年,所以再加一 所以,2005/1/1 就是星期六了 再來算,2005/3/1 星期幾 中間隔了二個月,把一月/二月的天數加上去 6 31 28 = 65 除以 7 餘 2(星期二) 好啦,進行到這個步驟,你已經可以把2005/03的月曆印出來囉 其中,只有算區間閏年比較麻煩一點,不過,你可以用好算的參考年來簡化 例如: 2000/1/1 之類的 記得中間好像有某一年某月少了幾週,這個地方要留意 詳細的年份不太記得了,大抵是 19xx 年左右,所以... 以 2000 以後的為參考吧
mingood
一般會員


發表:2
回覆:11
積分:2
註冊:2005-03-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-29 18:23:51 IP:218.170.xxx.xxx 未訂閱
引言: 首先,你先決定好要用誰做基準 例如你這裡是用 2003/1/1 星期三為例 現在是 2005/3/29 是星期幾呢? 只要算出今天跟 2003/1/1 隔幾天就行了 實際上有比較快的算法 已知一年有 365 天,365 除以 7 餘 1 可得知每隔一天,星期會加一,隔二年即加二 不過,閏年有 366 天,也就是星期會加二,不過,原本已經先加一了 所以你只要算出有幾個閏年,再算上去就行了 2005/1/1 ~ 2003/1/1 只有 2004 是閏年,所以再加一 所以,2005/1/1 就是星期六了 再來算,2005/3/1 星期幾 中間隔了二個月,把一月/二月的天數加上去 6 31 28 = 65 除以 7 餘 2(星期二) 好啦,進行到這個步驟,你已經可以把2005/03的月曆印出來囉 其中,只有算區間閏年比較麻煩一點,不過,你可以用好算的參考年來簡化 例如: 2000/1/1 之類的 記得中間好像有某一年某月少了幾週,這個地方要留意 詳細的年份不太記得了,大抵是 19xx 年左右,所以... 以 2000 以後的為參考吧
引言: 首先,你先決定好要用誰做基準 例如你這裡是用 2003/1/1 星期三為例 現在是 2005/3/29 是星期幾呢? 只要算出今天跟 2003/1/1 隔幾天就行了 實際上有比較快的算法 已知一年有 365 天,365 除以 7 餘 1 可得知每隔一天,星期會加一,隔二年即加二 不過,閏年有 366 天,也就是星期會加二,不過,原本已經先加一了 所以你只要算出有幾個閏年,再算上去就行了 2005/1/1 ~ 2003/1/1 只有 2004 是閏年,所以再加一 所以,2005/1/1 就是星期六了 再來算,2005/3/1 星期幾 中間隔了二個月,把一月/二月的天數加上去 6 31 28 = 65 除以 7 餘 2(星期二) 好啦,進行到這個步驟,你已經可以把2005/03的月曆印出來囉 其中,只有算區間閏年比較麻煩一點,不過,你可以用好算的參考年來簡化 例如: 2000/1/1 之類的 記得中間好像有某一年某月少了幾週,這個地方要留意 詳細的年份不太記得了,大抵是 19xx 年左右,所以... 以 2000 以後的為參考吧
嗚嗚~我就是卡在不知道要怎ㄇ定基準天~還有差幾天要怎ㄇ算QQ
mingood
一般會員


發表:2
回覆:11
積分:2
註冊:2005-03-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-30 23:24:20 IP:218.162.xxx.xxx 未訂閱
有沒有人能幫我解答阿>"< 定基轉日ㄉ寫法~ 跟算兩段日子差幾天要怎ㄇ寫阿QQ
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-31 00:25:44 IP:61.64.xxx.xxx 未訂閱
引言:有沒有人能幫我解答阿>"< 定基轉日ㄉ寫法~ 跟算兩段日子差幾天要怎ㄇ寫阿QQ
如果你實在想不出來,怎麼定基準日比較快 那你就定 2003/1/1 星期三吧 區間的閏年數,笨一點就跑個迴圈就可以算出來 剩下差幾天的算法,前面已有,就不多寫了 至於各個月份的天數,就建個陣列出來比較快 還是想不出來的話,建議搜尋萬年曆,可以找到不少.....
mingood
一般會員


發表:2
回覆:11
積分:2
註冊:2005-03-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-04 13:41:14 IP:192.192.xxx.xxx 未訂閱
日子的算法跟閏月的判別我都差不多會了~ 但是我要抓一天作基準日的寫法要怎麼寫阿?? 還有使用者輸入的日期跟我的基準日共插幾天又要怎麼寫阿QQ 有能人幫我一下嗎??
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-04-05 15:22:28 IP:202.39.xxx.xxx 未訂閱
引言: 日子的算法跟閏月的判別我都差不多會了~ 但是我要抓一天作基準日的寫法要怎麼寫阿??
用 EncodeDate 試試:
var
  dt: TDateTime;
begin
  // 三個參數分別傳入 年、月、日
  dt := EncodeDate(2005, 4, 5);
end;
引言: 還有使用者輸入的日期跟我的基準日共插幾天又要怎麼寫阿QQ 有能人幫我一下嗎??
假設使用者輸入日期為 2005/4/5 基準日期為 1950/1/1 兩者相差天數算法如下:
var
  dtStandard, dtInput: TDatetime;
  iDays: integer; // 相差天數
begin
  dtStandard := EncodeDate(1950, 1, 1);
  dtInput := EncodeDate(2005, 4, 5);
  if dtInput >= dtStandard then
    iDays := Trunc(dtInput - dtStandard)
  else
    iDays := Trunc(dtStnadard - dtInput);
end;
-- 分擔可以輕省, 分享帶來喜樂!
系統時間:2024-11-24 23:43:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!