原文:Small Fire · 日期操作 · ABAP 子专栏 · Small Fire 技术笔记

日期格式转换

系统标准Function

CONVERSION_EXIT_IDATE_OUTPUT
  INPUT:   20080203
  OUTPUT:  03FEB2008

CONVERT_DATE_TO_EXTERNAL
  INPUT:   20080203
  OUTPUT:  02/03/2008  "According to user's default setting.

CONVERT_DATE_TO_INTERNAL
  INPUT:   02/03/2008  "Should be same as the user's default setting
  OUPUT:   20080203

自定义工具

FUNCTION ZCONVERT_DATE_FORMAT.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     REFERENCE(ZNAME) LIKE  USR01-BNAME
*"  CHANGING
*"     REFERENCE(ZDATE) TYPE  C
*"----------------------------------------------------------------------
DATA: date_format LIKE usr01-datfm,
      year(4) TYPE c,
      month(2) TYPE c,
      day(2) TYPE c.
  zdate = sy-datum.
  lv_year = zdate+0(4).
  lv_month = zdate+4(2).
  lv_day = zdate+6(2).
  SELECT SINGLE datfm
    INTO lv_datfm FROM usr01
    UP TO 1 ROWS
    WHERE bname = zname .
  IF sy-subrc = 0.
    CLEAR zdate.
    CASE lv_datfm.
      WHEN '1'.
        CONCATENATE lv_day lv_month lv_year INTO zdate SEPARATED BY '.'.
      WHEN '2'.
        CONCATENATE lv_month lv_day lv_year INTO zdate SEPARATED BY '/'.
      WHEN '3'.
        CONCATENATE lv_month lv_day lv_year INTO zdate SEPARATED BY '-'.
      WHEN '4'.
        CONCATENATE lv_year lv_month lv_day INTO zdate SEPARATED BY '.'.
      WHEN '5'.
        CONCATENATE lv_year lv_month lv_day INTO zdate SEPARATED BY '/'.
      WHEN '6'.
        CONCATENATE lv_year lv_month lv_day INTO zdate SEPARATED BY '-'.
    ENDCASE.
  ELSE.
    CLEAR zdate.
    CONCATENATE lv_month lv_day lv_year INTO zdate SEPARATED BY '.'.
  ENDIF.
ENDFUNCTION.

常用的日期函数

日期有效性检查

CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
  EXPORTING
    date                            = sy-datum
  EXCEPTIONS
   PLAUSIBILITY_CHECK_FAILED       = 1
   OTHERS                          = 2
           .
IF sy-subrc <> 0.
  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

根据日期计算另一个日期

输入一个日期,输入间隔的天、月、年,输入运算符,函数返回计算出的日期。

CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
  EXPORTING
    DATE            = SY-DATUM
    DAYS            = 1
    MONTHS          = 0
    SIGNUM          = '+'
    YEARS           = 0
  IMPORTING
    CALC_DATE       = DATE_RESULT.

查询两个日期间的日间间隔

两个日期作差,即是两个日期相减,包括当天时间。

DATA: datediff TYPE p,
      timediff TYPE p,
      earliest TYPE c.
CALL FUNCTION 'SD_DATETIME_DIFFERENCE'
  EXPORTING
    date1            = '20140101'
    time1            = '240000'
    date2            = '20140101'
    time2            = '083000'
  IMPORTING
    datediff         = datediff     "返回日期差:0 "
    timediff         = timediff     "返回时间差:16"
    earliest         = earliest     "返回时间正负:2,1-负 0-相等 2-正"
  EXCEPTIONS
    invalid_datetime = 1
    OTHERS           = 2.

分别输入开始日期、开始时间、结束日期、结束时间,函数返回两个日期间隔秒数。

DATA: diff_second TYPE int4.
CALL FUNCTION 'SALP_SM_CALC_TIME_DIFFERENCE'
  EXPORTING
    date_1  = '20080801'
    time_1  = '17:22:12'
    date_2  = '20080802'
    time_2  = '18:22:12'
  IMPORTING
    seconds = diff_second.   "86,400"

获取日期所在的周数

DATA WEEK LIKE SCAL-WEEK.
CALL FUNCTION 'DATE_GET_WEEK'
  EXPORTING
    date               = sy-datum
  IMPORTING
    WEEK               = WEEK
  EXCEPTIONS
    DATE_INVALID       = 1
    OTHERS             = 2
            .
IF sy-subrc <> 0.
  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.