Kamis, 06 Juni 2013

Menghitung Hari Libur Keagamaan

Jika sebelumnya saya telah membagikan sebuah aplikasi Kalender Indonesia yang dilengkapi dengan hari-hari libur nasional dan keagamaan, dan prakiraan cuti bersama. Nah kali ini saya akan membahasa perumusan untuk menghitung hari libur nasional dan keagamaan yang berlaku di Indonesia.
Ayo, langsung saja ke prakteknya. Jalankan IDE VB6 Anda, buat sebuah project baru, kemudian tambahkan beberapa module pada project Anda, diantaranya:
- basIslam
- basKristen
- basHindu
- basBuddha
- basChina
- basNasional
Oke, tinggal menyalin kode yang berikut ini:
- basIslam
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
Option Explicit
Public IdulFitri As Date
Public IdulFitri2 As Date
Public IdulAdha As Date
Public MaulidNabi As Date
Public TahunBaruHijri As Date
Public IsraMiraj As Date
Public TahunIdulFitri As Long
Public TahunHijriyah As Long
Public TahunIdulAdha As Long
Public TahunMaulid As Long
Public TahunIsraMiraj As Long
Private Function intPart(floatNum)
    Dim lngReturn As Long
     
    If floatNum < -0.0000001 Then
        intPart = (floatNum - 0.0000001)
    End If
     
    intPart = Fix(floatNum + 0.0000001)
End Function
Private Function RoundDown(dblValue As Double) As Double
On Error GoTo PROC_ERR
Dim myDec As Long
myDec = InStr(1, CStr(dblValue), ".", vbTextCompare)
If myDec > 0 Then
    RoundDown = CDbl(Left(CStr(dblValue), myDec))
Else
    RoundDown = dblValue
End If
PROC_EXIT:
    Exit Function
PROC_ERR:
    MsgBox Err.Description, vbInformation, "Round Down"
End Function
Private Function RoundUp(dblValue As Double) As Double
On Error GoTo PROC_ERR
Dim myDec As Long
myDec = InStr(1, CStr(dblValue), ".", vbTextCompare)
If myDec > 0 Then
    RoundUp = CDbl(Left(CStr(dblValue), myDec)) + 1
Else
    RoundUp = dblValue
End If
PROC_EXIT:
    Exit Function
PROC_ERR:
    MsgBox Err.Description, vbInformation, "Round Up"
End Function
Private Function Trunc(dblValue As Double) As Long
On Error Resume Next
    Dim strValue As String
     
    If dblValue = 0 Then
        Trunc = 0
        Exit Function
    End If
     
    Dim myDec As Integer
    Dim Pisah() As String
     
    myDec = InStr(1, CStr(dblValue), ".", vbTextCompare)
     
    If myDec <> 0 Then
        Pisah = Split(CStr(dblValue), ".")
        strValue = Pisah(0)
    Else
        strValue = dblValue
    End If
     
    Trunc = CLng(strValue)
End Function
Public Function Masehi2Hijri(datMasehi As Date) As Date
    Dim dDay As Integer
    Dim dMonth As Integer
    Dim dYear As Long
    Const intAW As Long = 227016
     
    Dim intMonth As Integer
    Dim intYear As Integer
     
    Dim TA(0 To 12) As Integer
    Dim JH(0 To 12) As Integer
    Dim KA(0 To 12) As Integer
     
    Dim intAM1 As Long
    Dim intAM As Long
    Dim intAH As Long
    Dim intB As Integer
    Dim intThH1 As Integer
    Dim intDayCount As Integer
    Dim intAddYear As Integer
    Dim intTHM2 As Integer
    Dim intSisa As Integer
    Dim intModDay1 As Integer
    Dim intModDay2 As Integer
    Dim intBulan1 As Integer
    Dim x As Integer
         
    Dim intJmlHari As Integer
    Dim intSisaHari As Integer
     
    Dim dHijri As Integer
    Dim mHijri As Integer
    Dim yHijri As Integer
    Dim intODay As Integer
     
    Dim datResult As Date
     
    dDay = Day(datMasehi)
    dMonth = Month(datMasehi)
    dYear = Year(datMasehi)
     
    TA(0) = 29:    TA(1) = 30
    TA(2) = 29:    TA(3) = 30
    TA(4) = 29:    TA(5) = 30
    TA(6) = 29:    TA(7) = 30
    TA(8) = 29:    TA(9) = 30
    TA(10) = 29:    TA(11) = 30
    TA(12) = 29
     
    KA(0) = 0:    KA(1) = 2
    KA(2) = 5:    KA(3) = 7
    KA(4) = 10:    KA(5) = 13
    KA(6) = 16:    KA(7) = 18
    KA(8) = 21:    KA(9) = 24
    KA(10) = 26:    KA(11) = 29
    KA(12) = 32
     
    JH(0) = 0:    JH(1) = 30
    JH(2) = 59:    JH(3) = 89
    JH(4) = 118:    JH(5) = 148
    JH(6) = 177:    JH(7) = 207
    JH(8) = 236:    JH(9) = 266
    JH(10) = 295:    JH(11) = 325
    JH(12) = 354
     
    intMonth = IIf(dMonth < 3, dMonth + 12, dMonth)
    intYear = IIf(dMonth < 3, dYear - 1, dYear)
     
    intAM1 = Int(365.25 * intYear) + _
    Int(30.60001 * (intMonth + 1)) + dDay - 428
    intB = IIf(intAM1 < 577748, 0, 2 - _
    Int(intYear / 100) + Int(Int(intYear / 100) / 4))
     
    intAM = Int(365.25 * intYear) + _
    Int(30.60001 * (intMonth + 1)) + dDay + intB - 428
         
    intAH = intAM - intAW
    intThH1 = Int(intAH / 354.3671)
     
    intModDay1 = Round(intAH - 354.3671 * Int(intAH / 354.3671), 0.5)
    intModDay2 = RoundUp(intAH - 354.3671 * Int(intAH / 354.3671))
     
    intDayCount = IIf(intAH < 0, intModDay1, intModDay2)
    intAddYear = Int(intDayCount / 365)
     
    intTHM2 = intThH1 + intAddYear + 1
    intSisa = intDayCount Mod 365
     
    For x = 1 To 12
        If intSisa >= JH(x - 1) And intSisa <= JH(x) Then
            intBulan1 = x - 1
            Exit For
        End If
    Next
     
    intJmlHari = JH(intBulan1)
    intSisaHari = intSisa - intJmlHari
     
    dHijri = IIf(intSisaHari = 0, TA(intBulan1), intSisaHari)
    mHijri = IIf(intSisaHari = 0, intBulan1, _
    IIf((intBulan1 + 1) Mod 12 = 0, 12, (intBulan1 + 1) Mod 12))
     
    yHijri = intTHM2
     
    datResult = DateSerial(yHijri, mHijri, dHijri)
    Masehi2Hijri = datResult
End Function
Public Function Hijri2Masehi(datHijri As Date) As Date
    Dim dDay As Integer
    Dim dMonth As Integer
    Dim dYear As Long
    Dim datResult As Date
     
    Const intAW As Long = 227016
     
    dDay = Day(datHijri)
    dMonth = Month(datHijri)
    dYear = Year(datHijri)
     
    Dim intAH As Long
    Dim intAM As Long
     
    intAH = Trunc((11 * dYear) / 30) + _
            Trunc(354 * dYear) + _
            Trunc(30 * dMonth) - _
            Trunc((dMonth - 1) / 2) + dDay - 384
     
    intAM = intAH + intAW
     
    Dim intTHM1 As Long
    Dim intDayCount As Integer
    Dim intAddYear As Integer
    Dim intTHM2 As Long
    Dim intA As Integer
    Dim intB As Integer
    Dim intSisa As Integer
     
    intTHM1 = Int(intAM / 1461) * 4
    intDayCount = intAM Mod 1461
    intAddYear = Int(intDayCount / 365)
     
    intTHM2 = intTHM1 + intAddYear + 1
    intA = intDayCount Mod 365
    intB = IIf(intAM < 577748, 0, 2 - Int(intTHM2 / 100) + _
    Int(Int(intTHM2 / 100) / 4))
     
    intSisa = intA - intB
     
    Dim JH(0 To 12) As Integer
    Dim JLH(0 To 12) As Integer
     
    Dim intBulan1 As Integer
    Dim intMatch As Integer
    Dim x As Integer
     
    JH(0) = 31
    JH(1) = 31
    JH(2) = IIf((((intTHM2 Mod 4) = 0 Or (intTHM2 Mod 100) = 0) _
    Or (intTHM2 Mod 400) = 0), 29, 28)
     
    JH(3) = 31
    JH(4) = 30
    JH(5) = 31
    JH(6) = 30
    JH(7) = 31
    JH(8) = 31
    JH(9) = 30
    JH(10) = 31
    JH(11) = 30
    JH(12) = 31
     
    JLH(0) = 0
    JLH(1) = 31
     
    For x = 2 To 12
       JLH(x) = JLH(x - 1) + JH(x)
    Next
     
    For x = 1 To 12
        If intSisa >= JLH(x - 1) And intSisa <= JLH(x) Then
            intMatch = x - 1
            Exit For
        End If
    Next
     
    intBulan1 = IIf(intSisa < 31, 0, intMatch)
     
    Dim intJmlHari As Integer
    Dim intSisaHari As Integer
     
    intJmlHari = JLH(intBulan1)
    intSisaHari = intSisa - intJmlHari
     
    Dim dMasehi As Integer
    Dim mMasehi As Integer
    Dim yMasehi As Long
     
    dMasehi = IIf(intSisaHari = 0, JH(intBulan1), intSisaHari)
    mMasehi = IIf(intJmlHari = 0, intBulan1, _
    IIf((intBulan1 + 1) Mod 12 = 0, 12, (intBulan1 + 1) Mod 12))
    yMasehi = intTHM2
     
    datResult = DateSerial(yMasehi, mMasehi, dMasehi)
    Hijri2Masehi = datResult
End Function
Public Function Masehi2Hijri2(ByVal dDate As Date) As Date
    Dim j, k, l, n, jd
    Dim monthName As String
    Dim intDay As Integer, intMonth As Integer, intYear As Integer
     
    Dim arrFormat() As String
    Dim sSplit As String
    Dim strResult As String
    Dim sDay As String
    Dim sMonth As String
    Dim sYear As String
     
    intDay = Day(dDate)
    intMonth = Month(dDate)
    intYear = Year(dDate)
     
    If ((intYear > 1582) Or ((intYear = 1582) And (intMonth > 10)) _
        Or ((intYear = 1582) And (intMonth = 10) And (intDay > 14))) Then
        jd = intPart((1461 * (intYear + 4800 + _
        intPart((intMonth - 14) / 12))) / 4) + _
             intPart((367 * (intMonth - 2 - 12 * _
             (intPart((intMonth - 14) / 12)))) / 12) - _
             intPart((3 * (intPart((intYear + 4900 + _
             intPart((intMonth - 14) / 12)) / 100))) / 4) + intDay - 32075
    Else
        jd = 367 * intYear - intPart((7 * _
        (intYear + 5001 + intPart((intMonth - 9) / 7))) / 4) + _
        intPart((275 * intMonth) / 9) + intDay + 1729777
    End If
                     
    l = jd - 1948440 + 10632
    n = intPart((l - 1) / 10631)
    l = l - 10631 * n + 354
     
    j = (intPart((10985 - l) / 5316)) * (intPart((50 * l) / 17719)) + _
    (intPart(l / 5670)) * (intPart((43 * l) / 15238))
     
    l = l - (intPart((30 - j) / 15)) * (intPart((17719 * j) / 50)) - _
    (intPart(j / 16)) * (intPart((15238 * j) / 43)) + 29
     
    intMonth = intPart((24 * l) / 709)
    intDay = l - intPart((709 * intMonth) / 24)
    intYear = 30 * n + j - 30
     
    Masehi2Hijri2 = DateSerial(intYear, intMonth, intDay)
End Function
Public Function Hijri2Pasaran(datHijri As Date) As String
    Dim dDay As Integer
    Dim dMonth As Integer
    Dim dYear As Long
    Dim intAH As Long
    Dim intAM As Long
    Dim datResult As Date
    Dim PA(5) As String
     
    Const intAW As Long = 227016
     
    dDay = Day(datHijri)
    dMonth = Month(datHijri)
    dYear = Year(datHijri)
         
    intAH = Trunc((11 * dYear) / 30) + _
            Trunc(354 * dYear) + _
            Trunc(30 * dMonth) - _
            Trunc((dMonth - 1) / 2) + dDay - 384
     
    intAM = intAH + intAW
     
    PA(0) = "Wage"
    PA(1) = "Kliwon"
    PA(2) = "Legi"
    PA(3) = "Pahing"
    PA(4) = "Pon"
     
    Dim intMod As Integer
     
    intMod = intAM Mod 5
    Hijri2Pasaran = PA(intMod)
End Function
Public Sub Islam(intTahun As Integer)
On Error Resume Next
    Dim x As Integer
    Dim dDate As Date
    Dim datResult As Date
    Dim datHijri(1 To 366) As Date
    Dim datMasehi(1 To 366) As Date
     
    For x = 0 To 366
        dDate = DateAdd("d", x, DateSerial(intTahun, 1, 1))
        datMasehi(x) = dDate
        datHijri(x) = Masehi2Hijri(dDate)
         
        If Hijri2Masehi(datHijri(x)) <> datMasehi(x) Then
            datHijri(x) = Masehi2Hijri2(dDate)
            'If Hijri2Masehi(datHijri(x)) <> datMasehi(x) Then
                'datHijri(x) = DateAdd("d", -1, Masehi2Hijri(dDate))
            'End If
        End If
         
        Select Case Month(datHijri(x))
        Case 1
            If Day(datHijri(x)) = 1 Then
                TahunBaruHijri = datMasehi(x)
            End If
            TahunHijriyah = Year(datHijri(x))
        Case 3
            If Day(datHijri(x)) = 12 Then
                MaulidNabi = datMasehi(x)
            End If
            TahunMaulid = Year(datHijri(x))
        Case 7
            If Day(datHijri(x)) = 27 Then
                IsraMiraj = datMasehi(x)
            End If
            TahunIsraMiraj = Year(datHijri(x))
        Case 10
            If Day(datHijri(x)) = 1 Then
                IdulFitri = datMasehi(x)
            End If
            If Day(datHijri(x)) = 2 Then
                IdulFitri2 = datMasehi(x)
            End If
            TahunIdulFitri = Year(datHijri(x))
        Case 12
            If Day(datHijri(x)) = 10 Then
                IdulAdha = datMasehi(x)
            End If
            TahunIdulAdha = Year(datHijri(x))
        End Select
    Next
End Sub
- basKristen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Option Explicit
Public Paskah As Date
Public WafatIsa As Date
Public KenaikanIsa As Date
Public Natal As Date
Public TahunBaru As Date
Sub Kristen(intTahun As Integer)
    Dim intA As Integer
    Dim intB As Integer
    Dim intC As Integer
    Dim intD As Integer
    Dim intE As Integer
    Dim intF As Integer
    Dim intG As Integer
    Dim intH As Integer
    Dim intI As Integer
    Dim intJ As Integer
    Dim intK As Integer
    Dim intL As Integer
    Dim intM As Integer
    Dim intN As Integer
    Dim intO As Integer
     
    intA = intTahun Mod 19
    intB = intTahun Mod 4
    intC = intTahun Mod 7
     
    intH = IIf((intTahun >= 1900 And intTahun <= 2099), 5, 0)
    intI = IIf((intTahun >= 2100 And intTahun <= 2199), 6, 0)
    intJ = IIf((intTahun >= 2200 And intTahun <= 2299), 0, 0)
    intK = intH + intI + intJ
    intL = IIf((intTahun >= 1900 And intTahun <= 2099), 24, 0)
    intM = IIf((intTahun >= 2100 And intTahun <= 2199), 24, 0)
    intN = IIf((intTahun >= 2200 And intTahun <= 2299), 25, 0)
    intO = intL + intM + intN
     
    intD = ((19 * intA) + intO) Mod 30
    intE = ((2 * intB) + (4 * intC) + (6 * intD) + intK) Mod 7
    intF = IIf(intD + intE < 10, 3, 4)
    intG = IIf(intD + intE < 10, intD + intE + 22, intD + intE - 9)
     
    Paskah = DateSerial(intTahun, intF, intG)
    WafatIsa = DateAdd("d", -2, Paskah)
    KenaikanIsa = DateAdd("d", 39, Paskah)
    TahunBaru = DateSerial(intTahun, 1, 1)
    Natal = DateSerial(intTahun, 12, 25)
End Sub
Sumber : http://www.blogger.com/blogger.g?blogID=5684504499131365100#editor/target=post;postID=2687521146235328130

Tidak ada komentar:

Posting Komentar