计算日期间隔,以XX年XX月XX日格式显示

本文介绍了一种自定义的日期计算方法,包括如何计算指定日期的月间隔日期及如何计算两个日期之间的库龄。通过详细的伪代码步骤说明了日期计算的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个报表中用户提出了这样的需求, 与其花时间找标准函数(还不知道有没有),不如干脆自己写一个,代码如下:

 &---------------------------------------------------------------------*
*&      Form  getdate
*&---------------------------------------------------------------------*
*  以当前日期为准,计算月间隔日期
*----------------------------------------------------------------------*
FORM culc_date USING  p_diff_m
                   CHANGING p_v_date.

  DATA:v_year_n(4TYPE n,
           v_year_c(4TYPE c,
           v_month_n(2TYPE n,
           v_month_c(2TYPE c,
           v_day_n(2TYPE n,
           v_day_c(2TYPE c,
           v_date_c(8TYPE c,
           v_mod1 TYPE i,
           v_mod2 TYPE i,
           v_mod3 TYPE i.

  v_month_c = sy-datum+4(2).
  v_month_n = v_month_c.

  v_year_c = sy-datum+0(4).
  v_year_n = v_year_c.

  v_day_c = sy-datum+6(2).

  v_month_n = v_month_n - p_diff_m.
  IF v_month_n <= 0.
    v_month_n = v_month_n + 12 + p_diff_m - 1.
    v_year_n = v_year_n - 1.
  ENDIF.

  CASE v_month_n .
    WHEN 4 OR 6 OR  9 OR 11.
      IF v_day_n = 31.
        v_day_n = 30.
      ENDIF.
    WHEN 2.
      v_mod1 = v_year_n MOD  4.
      v_mod2 = v_year_n MOD 400.
      v_mod3 = v_year_n MOD 100.
      IF ( ( v_mod1 = 0 ) OR ( v_mod2 = 0 ) ) AND ( v_mod3 <> 0 ).
        IF ( v_day_n > 29 ).
          v_day_n = 29.
        ENDIF.
      ELSE.
        IF ( v_day_n > 28 ).
          v_day_n = 28.
        ENDIF.
      ENDIF.
  ENDCASE.

  v_year_c = v_year_n.
  v_month_c = v_month_n.

  CONCATENATE v_year_c v_month_c v_day_c INTO v_date_c.
  p_v_date = v_date_c.
ENDFORM.                    " getdate

*&---------------------------------------------------------------------*
*&      Form  calc_shlf
*&---------------------------------------------------------------------*
*       计算当前库龄
*----------------------------------------------------------------------*
*      -->P_WA_RESULT_BUDAT  text
*----------------------------------------------------------------------*
FORM calc_shlf  USING    p_budat  "报产日期
                CHANGING p_shlf. "库龄
  DATA:v_year_n_sy TYPE i,
       v_year_n TYPE i,
       v_year_c(4TYPE c,
       v_month_n_sy TYPE i,
       v_month_n TYPE i,
       v_month_c(2TYPE c,
       v_day_n_sy TYPE i,
       v_day_n TYPE i,
       v_day_c(2TYPE c,
       v_year_diff TYPE i,
       v_month_diff TYPE i,
       v_day_diff TYPE i,
       v_mod_4 TYPE i,
       v_mod_100 TYPE i,
       v_mod_400 TYPE i.

  v_year_n_sy = sy-datum+0(4).  " current year
  v_month_n_sy = sy-datum+4(2). " current month
  v_day_n_sy = sy-datum+6(2).   " current day

  v_year_n = p_budat+0(4).
  v_month_n = p_budat+4(2).
  v_day_n = p_budat+6(2).

  v_day_diff = sy-datum - p_budat.

  IF ( v_day_diff > 365 ) .
    v_year_diff = v_day_diff / 365" 取模
  ENDIF.

  IF ( v_month_n_sy < v_month_n ).
    v_month_diff = v_month_n_sy + 12 - v_month_n.
  ELSE.
    v_month_diff = v_month_n_sy - v_month_n.
  ENDIF.

  v_day_diff = v_day_n_sy - v_day_n.

  IF ( v_day_diff < 0 ).
    v_month_diff = v_month_diff - 1.
  ENDIF.

  CASE v_month_n.
    WHEN 4 OR 6 OR  9 OR 11.                                " 30 days
      PERFORM calc_day_diff USING 30 v_day_diff
                                                      v_day_n v_day_n_sy
                                  CHANGING v_day_diff.
    WHEN 1 OR 3 OR 5 OR 7 OR 8 OR 10 OR 12 .   " 31 days
      PERFORM calc_day_diff USING 31 v_day_diff
                                                       v_day_n v_day_n_sy
                                  CHANGING v_day_diff.
    WHEN 2.                                      " 28 or 29 days
      v_mod_4     = v_year_n MOD  4.
      v_mod_400 = v_year_n MOD 400.
      v_mod_100 = v_year_n MOD 100.
      IF ( ( v_mod_4 = 0 ) OR ( v_mod_400 = 0 ) ) AND ( v_mod_400 <> 0 ).
        PERFORM calc_day_diff USING 29 v_day_diff
                                                         v_day_n v_day_n_sy
                                    CHANGING v_day_diff.
      ELSE.
        PERFORM calc_day_diff USING 28 v_day_diff
                                                         v_day_n v_day_n_sy
                                    CHANGING v_day_diff.
      ENDIF.
  ENDCASE.

  p_shlf = space.

  IF ( v_year_diff > 0 ).
    v_year_c = v_year_diff.
    CONCATENATE v_year_c '年'  INTO  p_shlf.
  ENDIF.

  IF ( v_month_diff > 0 ).
    v_month_c = v_month_diff.
    CONCATENATE p_shlf v_month_c  '月'  INTO  p_shlf.
  ENDIF.

  IF ( v_day_diff >= 0 ).
    v_day_c = v_day_diff.
    CONCATENATE p_shlf v_day_c  '天'  INTO  p_shlf.
  ENDIF.

ENDFORM.                    "2 calc_shlf

*&---------------------------------------------------------------------*
*&      Form  calc_day_diff
*&---------------------------------------------------------------------*
*       计算间隔日期
*----------------------------------------------------------------------*
FORM calc_day_diff  USING  p_days_per_month
                                             p_day_diff_value
                                             p_day_n
                                             p_day_n_sy
                        CHANGING p_day_diff.
  IF (  p_day_diff_value < 0 ).
    p_day_diff = p_days_per_month  - p_day_n + p_day_n_sy.
  ELSE.
    IF ( p_day_n_sy > p_days_per_month  ).
      p_day_diff = p_days_per_month - p_day_n.
    ELSE.
      p_day_diff = p_day_n_sy - p_day_n.
    ENDIF.
  ENDIF.
ENDFORM.                    " calc_day_diff

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值