[ABAP] Systemzeit in UTC-Zeit (TIMESTAMP) wandeln

DATA: lv_utc TYPE timestamp.
DATA: lv_date TYPE d.
DATA: lv_time TYPE t.

START-OF-SELECTION.

  lv_date = sy-datum.
  lv_time = sy-uzeit.

  TRY.
      cl_abap_tstmp=>systemtstmp_syst2utc( EXPORTING
                                             syst_date = lv_date
                                             syst_time = lv_time
                                           IMPORTING
                                             utc_tstmp = lv_utc ).

      WRITE: / |UTC: { lv_utc TIMESTAMP = USER }|.
      WRITE: / |System-Datum: { lv_date DATE = USER }|.
      WRITE: / |System-Zeit: { lv_time TIME = USER }|.

    CATCH cx_root INTO DATA(e_text).
      WRITE: / e_text->get_text( ).
  ENDTRY.

[ABAP] Timestamp in Systemdatum (d) und Systemzeit (t) umrechnen

DATA: lv_ts TYPE timestamp.
DATA: lv_date TYPE d.
DATA: lv_time TYPE t.

* Timestamp nach Systemdatum (d) und Systemzeit (t)
GET TIME STAMP FIELD lv_ts.

* TIME ZONE sy-zonlo - lokale Timezone
* TIME ZONE 'UTC'    - UTC-Zeit
CONVERT TIME STAMP lv_ts TIME ZONE sy-zonlo INTO DATE lv_date TIME lv_time.

WRITE: / lv_date, lv_time.

* Systemdatum (d) und Systemzeit (t) nach Timestamp
lv_date = sy-datum.
lv_time = sy-uzeit.

* TIME ZONE sy-zonlo - lokale Timezone
* TIME ZONE 'UTC'    - UTC-Zeit
CONVERT DATE lv_date TIME lv_time INTO TIME STAMP lv_ts TIME ZONE sy-zonlo.

WRITE: / lv_ts TIME ZONE sy-zonlo.

[ABAP] string-Formatierungen mit String-Templates

* ab V7.31
* http://zevolving.com/2013/07/abap-string-templates-new-feature-in-abap-731/

* Hinweis: String-Templates funktionieren nur Programmen bei denen die Unicodeprüfung aktiv ist!
* Z.B. kommt es in Modulpool-Programmen zu Fehlern beim kompilieren des Codes und der Compiler moniert die '|'-Symbole

DATA: text TYPE string VALUE 'Text'.
DATA: atext TYPE string VALUE '012345'.
DATA: num TYPE p DECIMALS 3 VALUE '-123.45'.

* Case
WRITE: / |RAW:   { text CASE = RAW }|.   " Text
WRITE: / |LOWER: { text CASE = LOWER }|. " text
WRITE: / |UPPER: { text CASE = UPPER }|. " TEXT

* Align
WRITE: / |LEFT:   ->{ text WIDTH = 20 ALIGN = LEFT }<--|.   " >Text                <
WRITE: / |RIGHT:  ->{ text WIDTH = 20 ALIGN = RIGHT }<--|.  " >                Text<
WRITE: / |CENTER: ->{ text WIDTH = 20 ALIGN = CENTER }<--|. " >        Text        <

* Padding, Auffüllen mit definiertem Zeichen
WRITE: / |PAD: { text ALIGN = LEFT WIDTH = 20 PAD = '_' }|.   " Text________________
WRITE: / |PAD: { text ALIGN = RIGHT WIDTH = 20 PAD = '_' }|.  " ________________Text
WRITE: / |PAD: { text ALIGN = CENTER WIDTH = 20 PAD = '_' }|. " ________Text________

* führende Nullen hinzufügen, ersetzt FUBA 'CONVERSION_EXIT_ALPHA_INPUT'
WRITE: / |ALPHA: { atext WIDTH = 20 ALPHA = IN }|. " 00000000000000012345
* führende Nullen entfernen, ersetzt FUBA 'CONVERSION_EXIT_ALPHA_OUTPUT'
WRITE: / |ALPHA: { atext ALPHA = OUT }|.           " 12345

* Zahlen 1
WRITE: / |RAW:         { num NUMBER = RAW }|.         " -123.45
WRITE: / |USER:        { num NUMBER = USER }|.        " -123,45
WRITE: / |ENVIRONMENT: { num NUMBER = ENVIRONMENT }|. " -123,45

* Zahlen 2
WRITE: / |SCIENTIFIC:                   { num STYLE = SCIENTIFIC }|.                   " -1.2345E+02
WRITE: / |SCIENTIFIC_WITH_LEADING_ZERO: { num STYLE = SCIENTIFIC_WITH_LEADING_ZERO }|. " -0.12345E+03
WRITE: / |SCALE_PRESERVING_SCIENTIFIC:  { num STYLE = SCALE_PRESERVING_SCIENTIFIC }|.  " -1.2345E+0002
WRITE: / |ENGINEERING:                  { num STYLE = ENGINEERING }|.                  " -123.45E+00

* Datumsformat
WRITE: / |RAW:         { sy-datum DATE = RAW }|.         " 20160705
WRITE: / |ISO:         { sy-datum DATE = ISO }|.         " 2016-07-05
WRITE: / |USER:        { sy-datum DATE = USER }|.        " 05.07.2016
WRITE: / |ENVIRONMENT: { sy-datum DATE = ENVIRONMENT }|. " 05.07.2016

* Uhrzeitformat
WRITE: / |RAW:         { sy-uzeit TIME = RAW }|.         " 102336
WRITE: / |ISO:         { sy-uzeit TIME = ISO }|.         " 10:23:36
WRITE: / |USER:        { sy-uzeit TIME = USER }|.        " 10:23:36
WRITE: / |ENVIRONMENT: { sy-uzeit TIME = ENVIRONMENT }|. " 10:23:36

* Timestampformat
DATA: lv_tsl TYPE timestampl.
* Zeitstempel lang
GET TIME STAMP FIELD lv_tsl.
WRITE: / |SPACE:       { lv_tsl TIMESTAMP = SPACE }|.       " 2016-07-05 08:23:36.0908600
WRITE: / |ISO:         { lv_tsl TIMESTAMP = ISO }|.         " 2016-07-05T08:23:36,0908600
WRITE: / |USER:        { lv_tsl TIMESTAMP = USER }|.        " 05.07.2016 08:23:36,0908600
WRITE: / |ENVIRONMENT: { lv_tsl TIMESTAMP = ENVIRONMENT }|. " 05.07.2016 08:23:36,0908600

* ABAP Serialization XML (axXML)
WRITE: / |XML: { lv_tsl XSD = YES }|. " 20160705082336.09086

[ABAP] Externes Datum in internes Datum wandeln

Variante 1 (cl_abap_datfm)

DATA: lv_int TYPE sy-datum.
DATA: lv_ext_datum TYPE string VALUE '01.01.2017'.

TRY.
    cl_abap_datfm=>conv_date_ext_to_int(
      EXPORTING
        im_datext   = lv_ext_datum
        im_datfmdes = cl_abap_datfm=>get_datfm( ) " Default Datumsformat holen
      IMPORTING
        ex_datint   = lv_int ).
  CATCH cx_abap_datfm_no_date .
  CATCH cx_abap_datfm_invalid_date .
  CATCH cx_abap_datfm_format_unknown .
  CATCH cx_abap_datfm_ambiguous .
ENDTRY.

WRITE: / lv_int.

Variante 2 (CONVERT_DATE_TO_INTERNAL)

DATA: lv_date TYPE d.

CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
  EXPORTING
    date_external            = '20.02.2020'
  IMPORTING
    date_internal            = lv_date
  EXCEPTIONS
    date_external_is_invalid = 1.

WRITE: / lv_date.

Links

[ABAP] Popup zur Auswahl von Monat und Jahr anzeigen

DATA: lv_actmonth TYPE isellist-month.
DATA: lv_sel_month TYPE isellist-month.
DATA: lv_subrc TYPE sy-subrc.
  
lv_actmonth = |{ 2016 }{ 06 }|. " Eingabemonat: 06/2016

CALL FUNCTION 'POPUP_TO_SELECT_MONTH'
  EXPORTING
    actual_month               = lv_actmonth
*     factory_calendar           = 'X'
*     holiday_calendar           = 'X'
    language                   = sy-langu
    start_column               = 8
    start_row                  = 5
  IMPORTING
    selected_month             = lv_sel_month
    return_code                = lv_subrc
  EXCEPTIONS
    factory_calendar_not_found = 1
    holiday_calendar_not_found = 2
    month_not_found            = 3
    OTHERS                     = 4.
    
IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
  IF lv_subrc EQ 0.
    " ...
  ENDIF.
ENDIF.

[ABAP] Tag, Monat, Jahr zu Datumswert zusammenfügen

DATA: lv_date TYPE sy-datum.
DATA: lv_i_day TYPE cms_dte_oms_day.
DATA: lv_i_month TYPE cms_dte_oms_month.
DATA: lv_i_year TYPE cms_dte_oms_year.

lv_i_day = 01.
lv_i_month = 06.
lv_i_year = 2016.

CALL FUNCTION 'CMS_API_GENERAL_DDMMYY_TO_DATE'
  EXPORTING
    i_day   = lv_i_day
    i_month = lv_i_month
    i_year  = lv_i_year
  IMPORTING
    e_date  = lv_date.

[ABAP] Datumswert in Tag, Monat, Jahr zerlegen

DATA: lv_day TYPE char2.
DATA: lv_month TYPE char2.
DATA: lv_year TYPE char4.
DATA: lv_stext TYPE t247-ktx.
DATA: lv_ltext TYPE t247-ltx.
DATA: lv_userdate TYPE char10.
    
CALL FUNCTION 'HR_IN_GET_DATE_COMPONENTS'
  EXPORTING
    idate                         = sy-datum    " Eingabedatum
  IMPORTING
    day                           = lv_day
    month                         = lv_month
    year                          = lv_year
    stext                         = lv_stext
    ltext                         = lv_ltext
    userdate                      = lv_userdate " Datumsstring abhängig vom Userprofil
  EXCEPTIONS
    input_date_is_initial         = 1
    text_for_month_not_maintained = 2
    OTHERS                        = 3.

IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.