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
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти