Найти в Дзене
rustabapclub

QuarzBox: Конвертация даты и времени (преобразование во внешний формат)

Частая операция с датами и времени – это преобразование во внешний и внутренний формат. Давайте рассмотрим варианты преобразования во внешний формат (во внутренний, то есть парсинг – рассмотрим в одной из следующих заметок). Полный код программы находится по ссылке. Есть несколько возможностей преобразования даты во внешний формат: 1) С помощью EDIT MASK -{} Листинг1 [Преобразование во внешний формат с помощью EDIT MASK] DATA ls_date_conv TYPE ts_conv.
DATA lv_date_some TYPE sydatum .
DATA lv_date_some_str TYPE char10.
lv_date_some = sy-datum.
WRITE lv_date_some TO lv_date_some_str USING EDIT MASK '__-__-____'.
ls_date_conv-conv_type = 'USING EDIT MASK ''__-__-____'''.
ls_date_conv-conv_res = lv_date_some_str.
APPEND ls_date_conv TO mt_date_conv. -полный код тут ]]] 2) С помощью предустановленного системного формата. Предустановленных системных форматов несколько – они перечислены в значениях домена XUDATFM. -{} Листинг2 [Преобразование во внешний формат с помощь

Частая операция с датами и времени – это преобразование во внешний и внутренний формат. Давайте рассмотрим варианты преобразования во внешний формат (во внутренний, то есть парсинг – рассмотрим в одной из следующих заметок). Полный код программы находится по ссылке.

Есть несколько возможностей преобразования даты во внешний формат:

1) С помощью EDIT MASK

-{} Листинг1 [Преобразование во внешний формат с помощью EDIT MASK]

DATA ls_date_conv TYPE ts_conv.

DATA lv_date_some TYPE sydatum .
DATA lv_date_some_str TYPE char10.

lv_date_some = sy-datum.

WRITE lv_date_some TO lv_date_some_str USING EDIT MASK '__-__-____'.
ls_date_conv-conv_type = 'USING EDIT MASK ''__-__-____'''.
ls_date_conv-conv_res = lv_date_some_str.
APPEND ls_date_conv TO mt_date_conv.

-полный код тут ]]]

2) С помощью предустановленного системного формата. Предустановленных системных форматов несколько – они перечислены в значениях домена XUDATFM.

-{} Листинг2 [Преобразование во внешний формат с помощью EDIT MASK]

DATA ls_date_conv TYPE ts_conv.

DATA lv_date_some TYPE sydatum .
DATA lv_date_some_str TYPE char10.

lv_date_some = sy-datum.

WRITE lv_date_some TO lv_date_some_str MM/DD/YYYY.
ls_date_conv-conv_type = 'write to MM/DD/YYYY'.
ls_date_conv-conv_res = lv_date_some_str.
APPEND ls_date_conv TO mt_date_conv.

" возможные форматы - элемент данных XUDATFM
*1 DD.MM.YYYY (Gregorian Date)
*2 MM/DD/YYYY (Gregorian Date)
*3 MM-DD-YYYY (Gregorian Date)
*4 YYYY.MM.DD (Gregorian Date)
*5 YYYY/MM/DD (Gregorian Date)
*6 YYYY-MM-DD (Gregorian Date, ISO 8601)
*7 GYY.MM.DD (Japanese Date)
*8 GYY/MM/DD (Japanese Date)
*9 GYY-MM-DD (Japanese Date)
*A YYYY/MM/DD (Islamic Date 1)
*B YYYY/MM/DD (Islamic Date 2)
*C YYYY/MM/DD (Iranian Date)

" https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abendate_formats.htm

-полный код тут ]]]

3) С помощью функциональных модулей из группы функций SCA1.

Группа функций SCA1
Группа функций SCA1

CONVERSION_EXIT_IDATE_INPUT External date INPUT conversion exit (e.g. 01JAN1994)

CONVERSION_EXIT_IDATE_OUTPUT External date OUTPUT conversion exit (e.g. 01JAN1994)

CONVERSION_EXIT_LDATE_OUTPUT Internal date OUTPUT conversion exit (e.g. YYYYMMDD)

CONVERSION_EXIT_SDATE_INPUT External date (e.g. 01.JAN.1994) INPUT conversion exit

CONVERSION_EXIT_SDATE_OUTPUT Internal date OUTPUT conversion exit (e.g. YYYYMMDD)

CONVERT_DATE_TO_EXTERNAL Conversion: Internal to external date (like screen conversion)

CONVERT_DATE_TO_INTERNAL Conversion: External to internal date (like screen conversion)

CONV_EXIT_LDATE_OUTPUT_LANGU Internal date OUTPUT conversion exit (e.g. YYYYMMDD)

-{} Листинг3 [Преобразование во внешний формат с помощью группы функций SCA1]

METHOD _date_conv_via_function.
DATA ls_date_conv TYPE ts_conv.
DATA lv_date_some TYPE sydatum .
DATA lv_date_some_str TYPE char10.

lv_date_some = sy-datum - 3.
" function group SCA1

CALL FUNCTION '
CONVERSION_EXIT_LDATE_OUTPUT'
EXPORTING
input = lv_date_some " internal date format
IMPORTING
output = ls_date_conv-conv_res. " external date format
ls_date_conv-conv_type = 'Func CONVERSION_EXIT_LDATE_OUTPUT'.
APPEND ls_date_conv TO mt_date_conv.


CALL FUNCTION '
CONVERSION_EXIT_SDATE_OUTPUT'
EXPORTING
input = lv_date_some " internal date format
IMPORTING
output = ls_date_conv-conv_res. " external date format
ls_date_conv-conv_type = 'Func CONVERSION_EXIT_SDATE_OUTPUT'.
APPEND ls_date_conv TO mt_date_conv.

ENDMETHOD.

-полный код тут ]]]

4) С помощью класса CL_ABAP_DATFM. Класс может преобразовывать, как и SCA1, как во внутренний так и во внешний формат, но еще позволяет работать с форматами.

-{} Листинг4 Преобразование во внешний формат с помощью класса CL_ABAP_DATFM [[[

METHOD _date_conv_via_class.
DATA ls_date_conv TYPE ts_conv.
DATA lv_date_some TYPE sydatum .
DATA lv_date_some_str TYPE char20.

DATA lv_user_target_format TYPE xudatfm.
DATA lv_used_format TYPE xudatfm.

lv_date_some = sy-datum - 3.

DO 2 TIMES.

CASE sy-index.
WHEN 1.
lv_user_target_format = cl_abap_datfm=>get_datfm( ).
WHEN 2.
" можем взять формат страны согласно настройкам в таблице - T005X
lv_user_target_format = cl_abap_datfm=>get_country_datfm( country = 'KR' ).
WHEN OTHERS.
ENDCASE.

TRY .

cl_abap_datfm=>conv_date_int_to_ext(
EXPORTING
im_datint = lv_date_some " internal representation of date
im_datfmdes = lv_user_target_format " date format wanted for conversion
IMPORTING
ex_datext = lv_date_some_str " external representation of date
ex_datfmused = lv_used_format " date format used for conversion
).

ls_date_conv-conv_type = |cl_abap_datfm=> { lv_user_target_format }|.
ls_date_conv-conv_res = |{ lv_date_some_str }|.


CATCH cx_abap_datfm_format_unknown. " Exception in Class CL_ABAP_DATFM - Format unknown
ls_date_conv-conv_type = |cl_abap_datfm=> { lv_user_target_format }|.
ls_date_conv-conv_res = |Exception|.

ENDTRY.

APPEND ls_date_conv TO mt_date_conv.
ENDDO.


ENDMETHOD.

-полный код тут ]]]

5) С помощью оператора SET COUNTRY мы также можем привести целевому формату для конкретной страны. А присвоение между страной и форматом находится в таблице T005X. Детальный пример по всем странам можно увидеть в демо-программе DEMO_STRING_TEMPLATE_ENV_SETT.

-{}Листинг5 Преобразование во внешний формат с помощью оператора SET COUNTRY [[[

METHOD _date_conv_via_set_country.
" DEMO_STRING_TEMPLATE_ENV_SETT - расширенный пример
DATA ls_date_conv TYPE ts_conv.
DATA lv_date_some TYPE sydatum .
DATA lv_date_some_str TYPE char10.

DATA lv_default_country TYPE t005x-land.
DATA lv_format_country TYPE t005x-land VALUE 'KR'.

CALL FUNCTION 'ADDR_DEFAULT_SENDER_COUNTRY'
IMPORTING
ev_sender_country = lv_default_country.

lv_date_some = sy-datum - 3.
SET COUNTRY lv_format_country.
WRITE lv_date_some TO lv_date_some_str.
ls_date_conv-conv_type = |via Country { lv_format_country }|.
ls_date_conv-conv_res = lv_date_some_str.
APPEND ls_date_conv TO mt_date_conv.

SET COUNTRY lv_default_country.
WRITE lv_date_some TO lv_date_some_str.
ls_date_conv-conv_type = |via Country { lv_default_country }|.
ls_date_conv-conv_res = lv_date_some_str.
APPEND ls_date_conv TO mt_date_conv.

ENDMETHOD.

-полный код тут ]]]

Для преобразования/конвертации времени по внешний формат также есть несколько способов:

1) С помощью EDIT MASK

-{} Листинг6 Преобразование во внешний формат с помощью EDIT MASK [[[

METHOD _time_conv_edit_mask.
DATA lv_time_some TYPE syuzeit .
DATA lv_time_some_str TYPE text40.
DATA ls_time_conv TYPE ts_conv.

lv_time_some = sy-uzeit.
WRITE lv_time_some TO lv_time_some_str USING EDIT MASK 'Сейчас = __:__:__'.
ls_time_conv-conv_type = 'Time via edit mask: '.
ls_time_conv-conv_res = lv_time_some_str.

APPEND ls_time_conv TO mt_time_conv.

ENDMETHOD.

-полный код тут ]]]

2) С помощью SET COUNTRY

-{} Листинг7 Преобразование во внешний формат с помощью оператора SET COUNTRY [[[

METHOD _time_conv_set_country.
CONSTANTS lc_10mins TYPE int4 VALUE '600'.

DATA lv_time_some TYPE syuzeit .
DATA lv_time_some_str TYPE text40.
DATA ls_time_conv TYPE ts_conv.

DATA lv_default_country TYPE t005x-land.
DATA lv_format_country TYPE t005x-land VALUE 'KR'.

lv_time_some = sy-uzeit - lc_10mins.

CALL FUNCTION 'ADDR_DEFAULT_SENDER_COUNTRY'
IMPORTING
ev_sender_country = lv_default_country.

SET COUNTRY lv_format_country.
WRITE lv_time_some TO lv_time_some_str.
ls_time_conv-conv_type = |time via Country { lv_format_country }|.
ls_time_conv-conv_res = lv_time_some_str.
APPEND ls_time_conv TO mt_time_conv.

SET COUNTRY lv_default_country.
WRITE lv_time_some TO lv_time_some_str.
ls_time_conv-conv_type = |time via Country { lv_default_country }|.
ls_time_conv-conv_res = lv_time_some_str.
APPEND ls_time_conv TO mt_time_conv.

ENDMETHOD.

-полный код тут ]]]

3) Custom Format (куда без него…)

-{} Листинг2.8 Преобразование за рамками стандартного преобразования (custom) [[[

METHOD _time_conv_custom.
" DEMO_STRING_TEMPLATE_ENV_SETT - расширенный пример
DATA lv_time_some TYPE syuzeit .
DATA lv_time_some_str TYPE text40.
DATA ls_time_conv TYPE ts_conv.

DATA lv_launch_time_beg TYPE syuzeit VALUE '130000'.
DATA lv_launch_time_end TYPE syuzeit VALUE '140000'.


lv_time_some = '131214'.
IF lv_time_some GE lv_launch_time_beg
AND lv_launch_time_end LE lv_launch_time_end.
lv_time_some_str = 'Время обеда'.
ls_time_conv-conv_type = 'Любой каприз -)'.
ls_time_conv-conv_res = lv_time_some_str.
ENDIF.

APPEND ls_time_conv TO mt_time_conv.

ENDMETHOD.

-полный код тут ]]]

Давайте посмотрим результат вывода. А полный текст находится здесь.

Результат преобразования даты и времени во внешний формат различными способами
Результат преобразования даты и времени во внешний формат различными способами

QuarzBox / Кварцевая шкаТУЛка - содержимое