求阴历转阳历函数,请指导(阳历转阴历不需要的)
------解决方案--------------------
会阳历转阴历 求阴历转阳历
阴历日期 直接作为阳历日期
然后调转阴历函数 如果返回值 等于阴历日期 就得到阳历日期了 不等于 再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