农历函数("2007-09-22")="2007-08-13"

解决方案 »

  1.   

    VB编程实现农历的算法,请参见:
    http://www.atongrj.cn/show.aspx?id=1847&cid=36
    http://www.zxbc.cn/html/vbnet/20070419081118710.htm
      

  2.   

    润年的条件:年份可以被4整除,但不能被100整除或可以被400整除。
    润月的条件:农历闰月及其计算http://zhidao.baidu.com/question/12012571.html?fr=qrl3
      

  3.   

    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
        '公历每月前面的天数
        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
        '农历数据
        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
        '生成当前公历年、月、日 ==> GongliStr
        curYear = Year(D)
        curMonth = Month(D)
        curDay = Day(D)    '计算到初始时间1921年2月8日的天数: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
        '计算农历天干、地支、月、日
        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个二进制位的值
                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
        '生成农历==> NongliStr
        GetNlDate = CDate(curYear & "-" & Format(curMonth, "00") & "-" & Format(curDay, "00"))
    End Function
      

  4.   

    GetNlDate(#2006-8-24#) 试试,这是闰7月,根本无法用 Date 类型表示,所以我说 planetike (胜哥哥)  的要求无法满足。
      

  5.   

    修正了一下,取绝对值就可以了
    GetNlDate("1987年7月26日")="1987-6-1"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
        
        '公历每月前面的天数
        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
        '农历数据
        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
        '生成当前公历年、月、日 ==> GongliStr
        curYear = Year(D)
        curMonth = Month(D)
        curDay = Day(D)    '计算到初始时间1921年2月8日的天数: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
        '计算农历天干、地支、月、日
        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个二进制位的值
                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
        
        '是否是闰月
        curMonth = Abs(curMonth)
        
        '生成农历==> NongliStr
        GetNlDate = CDate(curYear & "-" & Format(curMonth, "00") & "-" & Format(curDay, "00"))
    End Function
      

  6.   

    GetNlDate(#2006-8-24#) 和 GetNlDate(#2006-7-25#) 一样,这算什么历法?
      

  7.   

    可以看看这个【幻蓝轩公历农历互转】[asp]可以查询1950~2050年的公历农历!公历转换成农历,也可农历转换成公历!
    http://www.oneti.cn/hlx/share.asp?mudi=download&ID=1