获得本月最后一天

来源:互联网 发布:知敬畏明底线 编辑:程序博客网 时间:2024/04/19 18:45

获得本月最后一天在abap里还是非常方便的,大概分的话有两种方法,一是自己算,而是调用系统函数。两个我都分别演示下。

1.自己运算

date+6(2) = '1'.
date+4(2) = date+4(2) + 1.
date = date - 1.

这个自己写的有个缺陷,如果为12月的话月份加一全部都变为0.所以还得添加判断的情况,修改后如下:

date+6(2) = '1'.
IF date+4(2) eq '12'.
  date+6(2) = '31'.
ELSe.
  date+4(2) = date+4(2) + 1.
  date = date - 1.
ENDIF.

2.调用系统函数

系统函数有两个函数,让我感觉奇怪的是居然有一个是有错误的!

错误的一个函数名是DATE_GET_MONTH_LASTDAY。它的具体实现我看了下果然是不对的,如下:

 DATA:
BEGIN OF ls_date,
      year(4)  TYPE n,
      month(2TYPE n,
      day(2)   TYPE n,
END OF ls_date.
DATA: l_date_tmp TYPE sy-datum.
ls_date = i_date.
ls_date-month = ls_date-month + 1.
ls_date-day   = 1.
l_date_tmp = ls_date.
* no special "leap year" algorithm necessary: in SAP NW we trust...
l_date_tmp = l_date_tmp - 1.
e_date = l_date_tmp.

它程序可读性还是挺高的,用了一个结构体来表示年月日。但是如果是12月的话结果就会错,跟我上面自己写的程序一样。

正确的一个系统调用程序名是:BKK_GET_MONTH_LASTDAY。

实现是:

 DATA: CHECK_YEAR_1 TYPE P.
DATA: CHECK_YEAR_2 TYPE P.
E_DATE(4) = I_DATE(4).
E_DATE+4(2) = I_DATE+4(2).
IF I_DATE+4(2) = '01'
OR I_DATE+4(2) = '03'
OR I_DATE+4(2) = '05'
OR I_DATE+4(2) = '07'
OR I_DATE+4(2) = '08'
OR I_DATE+4(2) = '10'
OR I_DATE+4(2) = '12'.
  E_DATE+6(2) = '31'.                " 31 days per month
ELSEIF I_DATE+4(2) = '04'
OR     I_DATE+4(2) = '06'
OR     I_DATE+4(2) = '09'
OR     I_DATE+4(2) = '11'.
  E_DATE+6(2) = '30'.                " 30 days per month
ELSEIF I_DATE+4(2) = '02'.           " leap year - problem
  E_DATE+6(2) = '28'.
  CHECK_YEAR_1 = I_DATE(4MOD 4.    " all 4 years is leap year
  IF CHECK_YEAR_1 = 0.
    E_DATE+6(2) = '29'.
    CHECK_YEAR_1 = I_DATE(4MOD 100." but not all 100 years
    CHECK_YEAR_2 = I_DATE(4MOD 400." excluding all 400 years
    IF    CHECK_YEAR_1 =  0
    AND CHECK_YEAR_2 <> 0.
      E_DATE+6(2) = '28'.
    ENDIF.
  ENDIF.
ENDIF.

比较傻瓜的实现,但是结果肯定是对的。个人觉得我总结的很详细,如有转载请注明出处!呵呵。

 

又发现了一个新的函数 RP_LAST_DAY_OF_MONTHS 同样获得本月最后一天。

 CONCATENATE pa_year pa_month '01' INTO gv_time.
  CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
    EXPORTING
      day_in            = gv_time
    IMPORTING
      last_day_of_month = gv_date_last
    EXCEPTIONS
      day_in_no_date    = 1
      OTHERS            = 2.

原创粉丝点击