VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

[原創]自定函數-求某年某月(倒數)第幾個星期幾是幾號

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
朱育興



註冊時間: 2003-08-25
文章: 661
來自: 台中市大里區

第 1 樓

發表發表於: 星期日 十月 26, 2003 4:20 am    文章主題: [原創]自定函數-求某年某月(倒數)第幾個星期幾是幾號 引言回覆

1.這是在大陸網站回答一個問題所寫的函數。
2.既然寫了,就拿來獻醜一下。
3.為求排列美觀,空白字元是全形空白;
 有興趣測試的人請自行轉為半形。
4.增加某年某月倒數第幾個星期幾是幾號

FUNCTION UGetDay
* ------------------------------------------------------------------- *
* 作者:2003.10.27 朱育興 YSC
* 功能:求某年某月(倒數)第幾個星期幾是幾號
* 語法:UGetDay(C1,N1,N2)
* 參數:1.C1 C(6) 代表西元年月,例如:200305
*    2.N1 N(2) -5 .. -1,1 .. 5
*         a.其值範圍: 1 到 5,代表該月第幾個
*         b.其值範圍:-1 到 -5,代表該月倒數第幾個
*    3.N2 N(1) 1 .. 7
*         代表星期幾,從 1 到 7 代表星期一,二,...,六,日
* 傳回值:N(2) 若成功,傳回天數;失敗傳回 0。
* 備註:參數值要符合規定,本函數對參數值不做檢查。
* 範例:1.? UGetDay("200310",-1,7) && 2003 年 10 月倒數第 1 個星期日
*     傳回值 = 26
*    2.? UGetDay("200310",4,7)  && 2003 年 10 月第 4 個星期日
*     傳回值 = 26
* ------------------------------------------------------------------- *
LPARAMETERS L_cYYYYMM,L_nNum,L_nWeekDay

LOCAL Wo_nDay,;     && N  函數的傳回值
   W1_cSetDate,;   && C  記錄 SET DATE TO ... 的設定值
   W1_cSetCentury,;  && C  記錄 SET CENTURY ... 的設定值
   W1_cSetMark,;   && C(1) 記錄 SET MARK TO ... 的設定值
   W1_dFLDate,;    && D  1.若 L_nNum > 0,代表該月的第一天
         ;    &&   2.若 L_nNum < 0,代表該月的最後一天
   W1_nDiffWeek,;   && N  指定的星期與 W1_dFLDate 的星期之差異數
   W1_dLocalDate,;  && D  所指定的星期與 W1_dFLDate 最近的日期
   W1_nNum,;     && N(2) 與 W1_dLocalDate 相對應的(倒數)第幾個
   W1_dRealDate    && D  本函數所要答案的日期值

W1_cSetDate  = SET("DATE")
W1_cSetCentury = SET("CENTURY")
W1_cSetMark  = SET("MARK")
SET DATE TO YMD
SET CENTURY ON
SET MARK TO "/"

Wo_nDay    = 0
W1_dFLDate  = CTOD(LEFT(L_cYYYYMM,4)+"/"+RIGHT(L_cYYYYMM,2)+"/01")
IF L_nNum < 0
 W1_dFLDate = GOMONTH(W1_dFLDate,1) - 1
ENDIF
W1_nDiffWeek = L_nWeekDay - DOW(W1_dFLDate,2)
W1_dLocalDate = W1_dFLDate + W1_nDiffWeek
IF L_nNum < 0
 W1_nNum   = L_nNum + IIF(W1_nDiffWeek>0,0,1)
ELSE
 W1_nNum   = L_nNum + IIF(W1_nDiffWeek<0,0,-1)
ENDIF
W1_dRealDate = W1_dLocalDate + 7 * W1_nNum
IF MONTH(W1_dRealDate) = MONTH(W1_dFLDate)
 Wo_nDay   = DAY(W1_dRealDate)
ENDIF

SET DATE TO &W1_cSetDate
SET CENTURY &W1_cSetCentury
SET MARK TO &W1_cSetMark
RETURN Wo_nDay
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
lukapp



註冊時間: 2003-09-07
文章: 42


第 2 樓

發表發表於: 星期一 十月 27, 2003 7:01 pm    文章主題: 引言回覆

? xgetday( '2003/11',4,5 ) && 4=第4星期 5 = 星期 4
***************************************************
func xgetday(xdate, xtimes,xweek )
local d1,dd,xtt
dd=set('date')
set date japan
d1=dow(ctod(xdate+'/01'))
set date (dd)
xtt=max(min(xtimes,4),1)
retu iif(xtt=1 .and.d1=xweek,1,;
iif(d1>xweek,(((8-(d1-xweek)))+((xtt-1)*7)),((xweek-d1)+1)+( xtt *7) ) )
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作