QuarzBox / Кварцевая шкаТУЛка ERP-вычислений. Простые операции с датой и временем
Друзья! В колонке "QuarzBox / Кварцевая шкаТУЛка ERP-вычислений" пойдет речь о полезных функциональных модулях и классах для вычислений/преобразований, применяемых в ERP и около-ERP системах, а также об алгоритмах, заложенных в подобных функциях.
Почему кварцевая? Потому что пьезоэлекрический эффект и точность тактов важны для электроники, а следовательно, для вычислительной техники.
В текущей публикации рассмотрим простые операции с датой и временем: системные переменные для дат, конвертация во внешний формат и арифметические операции.
Системные переменные (SYST) для даты и времени
В системных переменных есть несколько переменных, отведенные для определения текущего времени (описание можно найти в справке).
SY-DATUM – текущее время сервера; SY-UZEIT – текущее время на сервере; SY-DATLO – текущее время клиента; SY-TIMLO – время клиента; SY-ZONLO – временная зона клиента (из настроек пользователя).
Пусть у пользователя в настройках пользователя (распределительный центр) – часовой пояс (Владивосток), а дата-центр, расположен в Москве.
Временную зону сервера мы можем получить через ФМ GET_SYSTEM_TIMEZONE.
METHOD _show_sys_date_n_time. DATA lv_sys_timezone TYPE ttzz-tzone. CALL FUNCTION 'GET_SYSTEM_TIMEZONE' IMPORTING timezone = lv_sys_timezone " Time Zone EXCEPTIONS customizing_missing = 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 INTO sy-msgli. ENDIF. zcl_c8a014_show_html=>get_instance( )->add_para_val_ch( EXPORTING iv_id = '----Дата/Время сервера----' iv_value = '' )->add_para_val_ch( EXPORTING iv_id = 'SY-DATUM - дата сервера' iv_value = _conv_date_def( sy-datum ) )->add_para_val_ch( EXPORTING iv_id = 'SY-UZEIT - время сервера' iv_value = _conv_time_def( sy-uzeit ) )->add_para_val_ch( EXPORTING iv_id = 'Времен.зона сервера / FUNC GET_SYSTEM_TIMEZONE' iv_value = lv_sys_timezone )->add_para_val_ch( EXPORTING iv_id = 'Разница в секундах: временем сервера и UTC' iv_value = sy-tzone ) . ENDMETHOD.
Листинг 1.1. Пример использования даты и времени сервера (полный код здесь).
Результат вывода:
Рис. 1. Вывод системных дат и времени для клиента и сервера
Конвертация даты и времени (преобразование во внешний формат)
Частая операция с датами и времени – это преобразование во внешний и внутренний формат. Давайте рассмотрим варианты преобразования во внешний формат (во внутренний, то есть парсинг – рассмотрим в одной из следующих заметок). Полный код программы находится по ссылке.
Есть несколько возможностей преобразования даты во внешний формат:
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.1. Преобразование во внешний формат с помощью EDIT MASK
2. С помощью предустановленного системного формата. Предустановленных системных форматов несколько – они перечислены в значениях домена XUDATFM.
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
Листинг 2.2. Преобразование во внешний формат с помощью формата XUDATFM
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.
Листинг 2.3. Преобразование во внешний формат с помощью группы функций SCA1
4. С помощью класса CL_ABAP_DATFM. Класс может преобразовывать, как и SCA1, как во внутренний так и во внешний формат, но еще позволяет работать с форматами.
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.
Листинг 2.4. Преобразование во внешний формат с помощью класса CL_ABAP_DATFM
5. С помощью оператора SET COUNTRY мы также можем привести целевому формату для конкретной страны. А присвоение между страной и форматом находится в таблице T005X. Детальный пример по всем странам можно увидеть в демо-программе DEMO_STRING_TEMPLATE_ENV_SETT.
METHOD
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти