当前位置: 代码迷 >> PB >> 求阴历转阳历函数,请指导,该怎么解决
  详细解决方案

求阴历转阳历函数,请指导,该怎么解决

热度:41   发布时间:2016-04-29 08:46:29.0
求阴历转阳历函数,请指导
求阴历转阳历函数,请指导(阳历转阴历不需要的)

------解决方案--------------------
会阳历转阴历 求阴历转阳历

阴历日期 直接作为阳历日期 

然后调转阴历函数 如果返回值 等于阴历日期 就得到阳历日期了 不等于 再RelativeDate一天

哈哈

------解决方案--------------------
看看这里
http://blog.csdn.net/yyoinge/archive/2011/06/29/6575313.aspx
------解决方案--------------------
我的意思是这样的:

2010-02-13 这是阴历的日期,目标是求这天的阳历

阳历肯定是在阴历前面的(春节不会在元旦前吧?)

所以从阳历的2010-02-13开始,求阳历这天对应的阴历,结果是农历腊月三十 也就是阴历2009年12月30

阴历2009-12-30 不是我们想要的阴历2010-02-13 

那阳历往前加一天:RelativeDate(2010-02-13,1) 得到2010-02-14

再对2010-02-14求阴历,直到返回的阴历和2010-02-13相等。

则此时求阴历函数的传入参数,就是我们想要的结果。

mygetlunardate这个DLL函数是处理了闰月和特殊日期的。
------解决方案--------------------
提一下速
C/C++ code
/*********************************************************************函数名称:    of_lunar_to_day传递参数:    string as_lunar                         - 传入农历日期,写法为: 2011-01-01表示2011年正月初一                                                           2009-05-06R表示2009年闰五月初六                返回参数:    date   - 返回公历日期********************************************************************功能描述:    计算公历:传入农历计算公历********************************************************************备注: *********************************************************************/long ll_oldyear,ll_oldmonth,ll_olddaylong ll_newyear,ll_newmonth,ll_newdaydate old_date,new_date, first_date //第一次吻合的日期boolean i =false//ls_lunar = '2009-05-06'// 求这天的阳历boolean lb_leap = false //是否是闰月int lilb_leap = upper(mid(as_lunar, 11, 1)) = 'R'as_lunar = left(as_lunar, 10)ll_oldyear = integer(left(as_lunar, 4))ll_oldmonth = integer(mid(as_lunar, 6, 2))ll_oldday = integer(mid(as_lunar, 9, 2))if ll_oldyear < 1900 or ll_oldyear > 2050 then return 1900-01-01if ll_oldmonth < 1 or ll_oldmonth > 12 then return 1900-01-01if ll_oldday < 1 or ll_oldday > 31 then return 1900-01-01if not isdate(as_lunar) then //如果农历无法用公历表示,则往前走,找到第一个可以用农历表示的日期    li = ll_oldday    do while true        li --        if li = 0 then return 1900-01-01        if isdate(left(as_lunar, 8) + string(li)) then            old_date = date(left(as_lunar, 8) + string(li))            exit        end if    loopelse    old_date = date(as_lunar)end ifnew_date = old_datedo while i = false //一般是2-4次左右,最长可能循环6次    mygetlunardate(year(new_date),month(new_date),day(new_date),ll_newyear,ll_newmonth,ll_newday) // calendar.dll中阳历转阴历的函数    if ll_newyear = ll_oldyear and ll_newmonth = ll_oldmonth and ll_newday = ll_oldday then        if lb_leap then            lb_leap = false            first_date = new_date            new_date = RelativeDate(new_date,29) //下个月,起码是29天后了        else            i = true        end if    else        //取得的农历日期大于传入的日期,说明传入的日期有误,直接返回        if string(ll_newyear) + string(ll_newmonth, '00') > string(ll_oldyear) + string(ll_oldmonth, '00') then return 1900-01-01//没有发现        if ll_newmonth <> ll_oldmonth then            if ll_newday < 29 then                new_date = RelativeDate(new_date,29 - ll_newday)  //取得的农历日期还是上一个月的29号前的,直接跳到29号            else                new_date = RelativeDate(new_date,1)  //取得的农历日期是上一个月的29号后的,跳到下一天(因为下一天可能是30号也可能是1号)            end if        else //取得的农历日期已经是这个月的,直接跳到传入的农历日期那一天            new_date = RelativeDate(new_date,ll_oldday - ll_newday)        end if    end if loopreturn new_date
  相关解决方案