技術(shù) 點(diǎn)
- 技術(shù)
- 點(diǎn)
- V幣
- 點(diǎn)
- 積分
- 16029
|
本帖最后由 Henry D. Sy 于 2012-6-27 10:19 編輯
這是為網(wǎng)友寫(xiě)的,現(xiàn)在發(fā)上來(lái),給有需要的朋友參考,
不是很成熟,大家探討提意見(jiàn)啊---------謝謝 layaman_999 提出寶貴建議
增加:
春節(jié),端午,中秋,元旦,五一,國(guó)慶- '---------------------------------------------------------------------------------------
- ' Procedure : DeliveryDay
- ' DateTime : 2012-6-25 23:25
- ' Author : Henry D. Sy
- ' 參數(shù) : OrderDate 下單日期
- '
- ' : intPeriod 交貨周期(以天為單位)
- '
- '根據(jù)下單日期及交貨周期計(jì)算剔除非工作日(周六,日)以及五一,國(guó)慶,元旦之交貨日期
- '按理:交貨日期=下單日期+周期+非工作日天數(shù),但加上這段額外的天數(shù)中也許又有周六日
- '本例的重點(diǎn)就是利用遞歸函數(shù)來(lái)計(jì)算這非工作日中的非工作日.....
- '---------------------------------------------------------------------------------------
- '
- Public Function DeliveryDay(OrderDate As Date, intPeriod As Integer) As Date
- Dim i As Integer '循環(huán)變量
- Dim NWD As Integer '保存非工作日天數(shù)(Non_Work_Days)
- Dim myDate As Date '生產(chǎn)期間每天的日期,用來(lái)判斷是否為NWD
- Dim gDate As Date '計(jì)算過(guò)程中的臨時(shí)日期值
- Dim lunarDate As Date '農(nóng)歷日期
- On Error GoTo DeliveryDay_Error
- For i = 1 To intPeriod '這里i取值從1開(kāi)始,不考慮0,因?yàn)榻訂萎?dāng)日無(wú)需判斷是否工作日
-
- '考慮周六,日
- myDate = DateAdd("d", i, OrderDate)
- If Weekday(myDate) = 1 Or Weekday(myDate) = 7 Then
- NWD = NWD + 1
- End If
- '下面考慮五一,國(guó)慶,元旦
- If Format(myDate, "mmdd") = "0501" Or _
- Format(myDate, "mmdd") = "0101" Then
- NWD = NWD + 1
- ElseIf Format(myDate, "mmdd") = "1001" Then
- NWD = NWD + 3
- End If
- '考慮春節(jié),端午,中秋
- lunarDate = GetNlDate(myDate)
- Select Case Format(lunarDate, "mmdd")
- Case "0101"
- NWD = NWD + 3
- Case "0505", "0815"
- NWD = NWD + 1
- End Select
- Next
- '判斷及計(jì)算工作日結(jié)束
- gDate = DateAdd("d", intPeriod, OrderDate) '在不考慮工作日時(shí):交貨日期=下單日期+周期
- '下面開(kāi)始考慮工作日
- If NWD = 0 Then '沒(méi)有非工作日
- DeliveryDay = gDate '交貨日期=下單日期+周期
- '有非工作日
- Else
- DeliveryDay = DeliveryDay(gDate, NWD) '為了計(jì)算加上非工作日天數(shù)后的非工作日,這里函數(shù)引用自己本身(遞歸),繼續(xù)循環(huán)計(jì)算至NWD=0
- End If
- On Error GoTo 0
- Exit Function
- DeliveryDay_Error:
- MsgBox "Error " & Err.Number & " (" & Err.Description & ") "
- End Function
- Function GetNlDate(D As Date) As Date
- Dim MonthAdd(11), NongliData(99)
- Dim curYear, curMonth, curDay
- Dim NongliStr
- Dim i, m, n, k, isEnd, bit, TheDate
- '公歷每月前面的天數(shù)
- MonthAdd(0) = 0
- MonthAdd(1) = 31
- MonthAdd(2) = 59
- MonthAdd(3) = 90
- MonthAdd(4) = 120
- MonthAdd(5) = 151
- MonthAdd(6) = 181
- MonthAdd(7) = 212
- MonthAdd(8) = 243
- MonthAdd(9) = 273
- MonthAdd(10) = 304
- MonthAdd(11) = 334
- '農(nóng)歷數(shù)據(jù)
- NongliData(0) = 2635
- NongliData(1) = 333387
- NongliData(2) = 1701
- NongliData(3) = 1748
- NongliData(4) = 267701
- NongliData(5) = 694
- NongliData(6) = 2391
- NongliData(7) = 133423
- NongliData(8) = 1175
- NongliData(9) = 396438
- NongliData(10) = 3402
- NongliData(11) = 3749
- NongliData(12) = 331177
- NongliData(13) = 1453
- NongliData(14) = 694
- NongliData(15) = 201326
- NongliData(16) = 2350
- NongliData(17) = 465197
- NongliData(18) = 3221
- NongliData(19) = 3402
- NongliData(20) = 400202
- NongliData(21) = 2901
- NongliData(22) = 1386
- NongliData(23) = 267611
- NongliData(24) = 605
- NongliData(25) = 2349
- NongliData(26) = 137515
- NongliData(27) = 2709
- NongliData(28) = 464533
- NongliData(29) = 1738
- NongliData(30) = 2901
- NongliData(31) = 330421
- NongliData(32) = 1242
- NongliData(33) = 2651
- NongliData(34) = 199255
- NongliData(35) = 1323
- NongliData(36) = 529706
- NongliData(37) = 3733
- NongliData(38) = 1706
- NongliData(39) = 398762
- NongliData(40) = 2741
- NongliData(41) = 1206
- NongliData(42) = 267438
- NongliData(43) = 2647
- NongliData(44) = 1318
- NongliData(45) = 204070
- NongliData(46) = 3477
- NongliData(47) = 461653
- NongliData(48) = 1386
- NongliData(49) = 2413
- NongliData(50) = 330077
- NongliData(51) = 1197
- NongliData(52) = 2637
- NongliData(53) = 268877
- NongliData(54) = 3365
- NongliData(55) = 531109
- NongliData(56) = 2900
- NongliData(57) = 2922
- NongliData(58) = 398042
- NongliData(59) = 2395
- NongliData(60) = 1179
- NongliData(61) = 267415
- NongliData(62) = 2635
- NongliData(63) = 661067
- NongliData(64) = 1701
- NongliData(65) = 1748
- NongliData(66) = 398772
- NongliData(67) = 2742
- NongliData(68) = 2391
- NongliData(69) = 330031
- NongliData(70) = 1175
- NongliData(71) = 1611
- NongliData(72) = 200010
- NongliData(73) = 3749
- NongliData(74) = 527717
- NongliData(75) = 1452
- NongliData(76) = 2742
- NongliData(77) = 332397
- NongliData(78) = 2350
- NongliData(79) = 3222
- NongliData(80) = 268949
- NongliData(81) = 3402
- NongliData(82) = 3493
- NongliData(83) = 133973
- NongliData(84) = 1386
- NongliData(85) = 464219
- NongliData(86) = 605
- NongliData(87) = 2349
- NongliData(88) = 334123
- NongliData(89) = 2709
- NongliData(90) = 2890
- NongliData(91) = 267946
- NongliData(92) = 2773
- NongliData(93) = 592565
- NongliData(94) = 1210
- NongliData(95) = 2651
- NongliData(96) = 395863
- NongliData(97) = 1323
- NongliData(98) = 2707
- NongliData(99) = 265877
- '生成當(dāng)前公歷年、月、日 ==> GongliStr
- curYear = Year(D)
- curMonth = Month(D)
- curDay = Day(D)
- '計(jì)算到初始時(shí)間1921年2月8日的天數(shù):1921-2-8(正月初一)
- TheDate = (curYear - 1921) * 365 + Int((curYear - 1921) / 4) + curDay + MonthAdd(curMonth - 1) - 38
- If ((curYear Mod 4) = 0 And curMonth > 2) Then
- TheDate = TheDate + 1
- End If
- '計(jì)算農(nóng)歷天干、地支、月、日
- isEnd = 0
- m = 0
- Do
- If (NongliData(m) < 4095) Then
- k = 11
- Else
- k = 12
- End If
- n = k
- Do
- If (n < 0) Then
- Exit Do
- End If
- '獲取NongliData(m)的第n個(gè)二進(jìn)制位的值
- bit = NongliData(m)
- For i = 1 To n Step 1
- bit = Int(bit / 2)
- Next
- bit = bit Mod 2
- If (TheDate <= 29 + bit) Then
- isEnd = 1
- Exit Do
- End If
- TheDate = TheDate - 29 - bit
- n = n - 1
- Loop
- If (isEnd = 1) Then
- Exit Do
- End If
- m = m + 1
- Loop
- curYear = 1921 + m
- curMonth = k - n + 1
- curDay = TheDate
- If (k = 12) Then
- If (curMonth = (Int(NongliData(m) / 65536) + 1)) Then
- curMonth = 1 - curMonth
- ElseIf (curMonth > (Int(NongliData(m) / 65536) + 1)) Then
- curMonth = curMonth - 1
- End If
- End If
- '生成農(nóng)歷==> NongliStr
- GetNlDate = CDate(curYear & "- " & Format(curMonth, "00 ") & "- " & Format(curDay, "00 "))
- End Function
復(fù)制代碼 |
本帖子中包含更多資源
您需要 登錄 才可以下載或查看,沒(méi)有帳號(hào)?注冊(cè)
x
|