ABAP 根据阳历日期获得阴历日期

FUNCTION zfm_get_chinese_date.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_DATE) TYPE  SY-DATUM DEFAULT SY-DATUM
*"     REFERENCE(IV_FLAG) TYPE  CHAR1 OPTIONAL
*"  EXPORTING
*"     REFERENCE(EV_DATE) TYPE  SY-DATUM
*"     REFERENCE(EV_DATE_TEXT) TYPE  CHAR20
*"     REFERENCE(EV_ANIMAL_SIGN) TYPE  CHAR10
*"----------------------------------------------------------------------

  DATA: lv_year TYPE char4 ,
         lv_month TYPE scmamonth ,
         lv_day TYPE char2,
         lv_year_export TYPE char4 ,
         lv_month_export TYPE scmamonth ,
         lv_day_export TYPE day_nr,
         lv_year_add TYPE char4,
         lv_month_add TYPE char2 ,
         lv_day_add TYPE char3,
         lv_run TYPE c,
         lv_con_date TYPE sy-datum,
         lv_set_date TYPE sy-datum,
         lv_date_export TYPE char20,
         lv_get_day TYPE i.
*  DATA:LR_CONVERT TYPE REF TO CL_RPE_CONVERT.
*  CREATE OBJECT LR_CONVERT.

*取得输入的日期
  lv_year = iv_date+0(4) .
  lv_month = iv_date+4(2) .
  lv_day = iv_date+6(2) .


  DATA:lv_1942 TYPE i.

  IF lv_year < 1900.
    lv_1942 = ( 1942 - lv_year ) / 19.
    lv_year = lv_year + ( 19 * lv_1942 ).
  ENDIF.

  IF lv_year > 2100.
    lv_1942 = ( lv_year - 1942 / 19.
    lv_year = lv_year + ( 19 * lv_1942 ).
  ENDIF.

  DATA:lv_times TYPE i,
       lv_index TYPE i,
       lv_data TYPE i.

  DATA:lv_month_add_int TYPE i,
       lv_data_int TYPE i,
       lv_data_13 TYPE char2,
       lv_string TYPE string,
       lv_string_i TYPE i,
       lv_xstring TYPE xstring.

  lv_year_add = lv_year.
*反算
  IF iv_flag = 'X'.
    READ TABLE gt_data WITH KEY year = lv_year_add.
    IF sy-subrc = 0 .
      lv_month_add = gt_data-data+14(2)."取农历1.1对应的阳历
      lv_day_add = gt_data-data+16(2).
      CONCATENATE lv_year_add lv_month_add lv_day_add INTO lv_con_date.

      lv_day_add = lv_day.

      lv_times = lv_month - 1.

      lv_index = 0.
      DO lv_times TIMES. "根据差异的月份计算天数
        lv_data = gt_data-data+lv_index(1).
        lv_index  = lv_index + 1.
        lv_day_add = lv_day_add + 29 + lv_data.
      ENDDO.

      lv_set_date = lv_con_date + lv_day_add - 1.

*是否为闰月,如果为闰月,再加上一遍闰月的天数
      IF gt_data-data+13(1) > '0'.
        lv_string = gt_data-data+13(1).
        CASE lv_string.
          WHEN 'A'.
            lv_string = '10'.
          WHEN 'B'.
            lv_string = '11'.
          WHEN 'C'.
            lv_string = '12'.
        ENDCASE.

        IF lv_string <= lv_month.
          lv_set_date = lv_set_date + 29 + gt_data-data+12(1).
        ENDIF.
      ENDIF.

      lv_date_export = lv_set_date.
      lv_year_export = lv_set_date+0(4) .
      lv_month_export = lv_set_date+4(2) .
      lv_day_export = lv_set_date+6(2) .
      CONCATENATE lv_year_export lv_month_export lv_day_export INTO ev_date.

      RETURN.
    ENDIF.
  ENDIF.

*初始化
  DO.
    READ TABLE gt_data WITH KEY year = lv_year_add.
    IF sy-subrc = 0.
      lv_month_add = gt_data-data+14(2).
      lv_day_add = gt_data-data+16(2).
      CONCATENATE lv_year_add lv_month_add lv_day_add INTO lv_con_date.
      CONCATENATE lv_year lv_month lv_day INTO lv_set_date.

      lv_get_day = lv_set_date - lv_con_date.

      IF lv_get_day < 0.
        lv_year_add = lv_year_add - 1."计算跨年的情况
      ELSE.
        EXIT.
      ENDIF.
    ELSE.
      EXIT.
    ENDIF.
  ENDDO.



  lv_day_add = 1. lv_month_add = 1.
  DO lv_get_day TIMES.
    lv_day_add = lv_day_add + 1.

    READ TABLE gt_data WITH KEY year = lv_year_add.
    IF sy-subrc = 0.
      lv_month_add_int = lv_month_add - 1.
      lv_data_int = gt_data-data+lv_month_add_int(1) + 30.
      lv_data_13 = gt_data-data+12(1) + 30.

      IF lv_day_add = lv_data_int OR ( lv_run = 'X' AND lv_day_add = lv_data_13 ).
        lv_string = gt_data-data+13(1).
        CASE lv_string.
          WHEN 'A'.
            lv_string = '10'.
          WHEN 'B'.
            lv_string = '11'.
          WHEN 'C'.
            lv_string = '12'.
        ENDCASE.

        IF lv_run = '' AND lv_month_add = lv_string.
          lv_run = 'X'.
        ELSE.
          lv_run = ''.
          lv_month_add = lv_month_add + 1.
        ENDIF.

        lv_day_add = 1.

      ENDIF.
    ENDIF.
  ENDDO.


  lv_year_export = lv_year_add.
  lv_month_export = lv_month_add.
  lv_day_export = lv_day_add.
  CONCATENATE lv_year_export lv_month_export lv_day_export INTO ev_date.

**农历描述
  DATA:lv_count TYPE i.
  DATA:lv_dd_string TYPE char100 VALUE '初一初二初三初四初五初六初七初八初九初十十一十二十三十四十五十六十七十八十九二十廿一廿二廿三廿四廿五廿六廿七廿八廿九三十'.
  DATA:lv_mm_string TYPE char20 VALUE '正二三四五六七八九十冬腊'.

  lv_count = ( lv_day_add - 1 ) * 2.
  lv_date_export+6(2) = lv_dd_string+lv_count(2).
  lv_count = lv_month_add - 1.
  CONCATENATE  lv_mm_string+lv_count(1) '月' INTO lv_date_export+4(2).
  ev_date_text = lv_date_export.

**天干地支
  DATA:lv_tg_string TYPE char10 VALUE '甲乙丙丁戊己庚辛壬癸'.
  DATA:lv_dz_string TYPE char12 VALUE '子丑寅卯辰巳午未申酉戌亥'.
  DATA:lv_sx_string TYPE char12 VALUE '鼠牛虎兔龙蛇马羊猴鸡狗猪'.
  DATA:lv_year_text TYPE char20.
  DATA:lv_mod TYPE i.

  lv_mod = ( ( lv_year_export - 4 ) MOD 10 ).

  lv_year_text = lv_tg_string+lv_mod(1).

  lv_mod = ( ( lv_year_export - 4 ) MOD 12 ).

  CONCATENATE lv_year_text lv_dz_string+lv_mod(1) '年' INTO lv_year_text.

  CONCATENATE lv_year_text ev_date_text INTO ev_date_text.

  CONCATENATE '属相:' lv_sx_string+lv_mod(1) INTO ev_animal_sign
ENDFUNCTION.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值