FM для преобразования времени из 24-часового в 12-часовой формат?

Мне нужно отформатировать DateTime, который находится в UTC на основе пользовательских настроек, которые включают его часовой пояс (CET / IST и т. Д.) И формат времени (24 часа / 12 часов).

Я смог найти CONVERT TIME STAMP оператор, который принимает только TIME ZONE в качестве параметра и выполняет это преобразование:

DATA: lv_timestampl TYPE timestampl VALUE '20200219095959.0000000',
      lv_date       TYPE d,
      lv_time       TYPE t.
CONVERT TIME STAMP lv_timestampl TIME ZONE sy-zonlo INTO DATE lv_date TIME lv_time.

Моя цель - преобразовать этот lv_timestampl на основе TimeZone и TimeFormat вместе.

PS: Я мог бы просто сделать эту -12 манипуляцию с lv_time после оператора CONVERT TIME STAMP и добавить PM/AM, но я ищу стандартный способ сделать это.


person Vaibhav Malik    schedule 19.02.2020    source источник
comment
Термины DateTime, TimeZone, TimeFormat ничего не значат в ABAP, можете ли вы объяснить, о чем вы имеете в виду? Приведите пример ввода и ожидаемого результата.   -  person Sandra Rossi    schedule 19.02.2020
comment
Да, предоставьте образцы того, что вы хотите получить от чего   -  person Suncatcher    schedule 19.02.2020


Ответы (2)


Хорошо, позвольте мне быть вам живым помощником сегодня, если вы не смогли найти справка по строковым шаблонам.

Шаблон для преобразования метки времени в UTC:

DATA(ld_tims_utc) = |{ lv_timestampl TIMESTAMP = ENVIRONMENT }|.

возвращается

19.02.2020 09:59:59,0000000

Шаблон для преобразования метки времени в явно указанный часовой пояс:

DATA(ld_tims_zone) = |{ lv_timestampl TIMESTAMP = ENVIRONMENT TIMEZONE = 'CET' }|.

возвращается

19.02.2020 10:59:59,0000000

Получение времени и даты из метки времени (не timestampl, поэтому требуется преобразование):

cl_abap_tstmp=>systemtstmp_utc2syst( EXPORTING
                                       utc_tstmp = CONV timestamp( lv_timestampl )
                                     IMPORTING
                                       syst_date = lv_date
                                       syst_time = lv_time ).

Вывод в 12-часовом формате:

SET COUNTRY 'US'.
DATA(time_us) = |{ lv_time TIME = ENVIRONMENT }|. "gives 01:55:43 PM

Вывод в 24-часовом формате:

SET COUNTRY 'DE'.
DATA(time_de) = |{ lv_time TIME = ENVIRONMENT }|. "gives 13:55:43

Для вывода форматов времени AM / PM их необходимо поддерживать в поле TIMEFM таблицы USR01 aka Пользовательские настройки или таблица t005x, также известная как Настройки страны (tcode OY01).

person Suncatcher    schedule 19.02.2020
comment
Несколько других: ваш ответ предполагает, что timestamp и timestampl содержат значения в формате UTC. Параметр TIMESTAMP не конвертирует в UTC (это уже UTC), он применяет шаблон (ОКРУЖЕНИЕ означает, что это зависит от пользователя или страны. Опечатка: timestamlp - ›timestampl. cl_abap_tstmp=>systemtstmp_utc2syst возвращает дату и время в часовом поясе сервера ABAP . - person Sandra Rossi; 19.02.2020
comment
The TIMESTAMP option doesn't convert to UTC в справке они говорят: Если TIMEZONE = tz является начальным, часовой пояс неявно устанавливается на UTC и контент форматируется как отметка времени UTC. То же самое происходит, когда tz отсутствует в таблице TTZZ или когда добавление TIMEZONE не определено - person Suncatcher; 20.02.2020
comment
cl_abap_tstmp=>systemtstmp_utc2syst returns the date and time in the ABAP server time zone да, и поэтому я явно установил страну, прежде чем показывать время - person Suncatcher; 20.02.2020
comment
Все дело в неоднозначном значении конвертировать в UTC. Это означает либо рендеринг в заданном формате, например в ISO 8601, либо добавление или вычитание числа часов от исходного часового пояса до UTC (а в ABAP отметка времени чаще всего упоминается как значение даты / времени в формате UTC (часовой пояс по Гринвичу). Поэтому я бы предпочел термин из SAP в формате UTC, а не преобразованный в UTC. и добавление примера результата, чтобы прояснить его. - person Sandra Rossi; 20.02.2020
comment
это дело вкуса, отображаемое значение времени изменяется, поэтому я предпочитаю использовать convert, формат не имеет значения для изменения представления без изменения значения. В любом случае я дал ссылку на документацию, все могут читать первоисточник - person Suncatcher; 20.02.2020
comment
Это именно то, что я искал. Спасибо! - person Vaibhav Malik; 20.02.2020

FM HRVE_CONVERT_TIME можно использовать для преобразования обоими способами (преобразование 12 часов в 24 часа и 24 часов в 12 часов).

Вы можете объединить результаты с уже найденным FM.

person mxstml    schedule 19.02.2020