Меню

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

У вас уже есть учетная запись?

Войти