日期格式转换
系统标准Function
CONVERSION_EXIT_IDATE_OUTPUT:INPUT (20080203);OUTPUT (03FEB2008)CONVERT_DATE_TO_EXTERNAL:INPUT (20080203);OUTPUT (02/03/2008) 输出结果参照用户默认设置的格式CONVERT_DATE_TO_INTERNAL:INPUT (02/03/2008) 格式应与用户的默认设置相同;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.
F4 Help for Month
INCLUDE rmcs0f0m.
SELECT-OPTIONS: s_month FOR s001-spmon NO-EXTENSION NO INTERVALS OBLIGATORY.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_month-low.
PERFORM monat_f4 USING s_month-low.
FORM monat_f4 USING month.
DATA lv_month TYPE isellist-month.
FIELD-SYMBOLS <fs_field> TYPE any.
lv_month = sy-datum+0(6).
CALL FUNCTION 'POPUP_TO_SELECT_MONTH'
EXPORTING
actual_month = lv_month
* FACTORY_CALENDAR = ' '
* HOLIDAY_CALENDAR = ' '
* LANGUAGE = SY-LANGU
* START_COLUMN = 8
* START_ROW = 5
IMPORTING
selected_month = lv_month
* RETURN_CODE =
EXCEPTIONS
factory_calendar_not_found = 1
holiday_calendar_not_found = 2
month_not_found = 3
OTHERS = 4.
IF sy-subrc = 0.
CHECK lv_month <> '000000'.
ASSIGN month TO <fs_field>.
IF <fs_field> IS ASSIGNED.
<fs_field> = lv_month.
UNASSIGN <fs_field>.
ENDIF.
ENDIF.
ENDFORM.
常用的日期函数
日期有效性检查
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.
根据日期计算另一个日期
返回指定月以前的日期
DATA DATE LIKE SCAL-DATE.
CALL FUNCTION ‘CCM_GO_BACK_MONTHS’
EXPORTING
CURRDATE = sy-datum
BACKMONTHS = 6
IMPORTING
NEWDATE = DATE .
输入一个日期,输入间隔的天、月、年,输入运算符,函数返回计算出的日期。
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
DATE = SY-DATUM
DAYS = 1
MONTHS = 0
SIGNUM = '+' "+,-"
YEARS = 0
IMPORTING
CALC_DATE = DATE_RESULT.
查询两个日期间的日间间隔
返回两个日期之间的年数、月数、天数
CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'
EXPORTING
I_DATE_FROM = '20180202'
* I_KEY_DAY_FROM =
I_DATE_TO = '20180919'
* I_KEY_DAY_TO =
* I_FLG_SEPARATE = ’ ’
IMPORTING
E_DAYS = E_DAYS "229:相差天数"
E_MONTHS = E_MONTHS "8:相差月数"
E_YEARS = E_YEARS . "1:相差年数"
两个日期作差,即是两个日期相减,包括当天时间。
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.
获得某周的第一天日期
DATA DATE LIKE SCAL-DATE.
CALL FUNCTION ‘WEEK_GET_FIRST_DAY’
EXPORTING
WEEK = '201848'
IMPORTING
DATE = DATE. "2018-11-26"