[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.

[ABAP] Monatsnamen ermitteln (sprachabhängig)

DATA: it_month_names TYPE STANDARD TABLE OF t247.
DATA: rc TYPE sy-subrc.

CALL FUNCTION 'MONTH_NAMES_GET'
  EXPORTING
    language              = sy-langu
  IMPORTING
    return_code           = rc
  TABLES
    month_names           = it_month_names
  EXCEPTIONS
    month_names_not_found = 1
    OTHERS                = 2.

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 rc = 0.
    LOOP AT it_month_names INTO DATA(wa).
      WRITE: / wa-spras, wa-mnr, wa-ktx, wa-ltx.
    ENDLOOP.
  ENDIF.
ENDIF.

[ABAP] Mit Zeitstempel rechnen

Variante 1 (cl_abap_tstmp)

DATA: l_ts TYPE timestamp.
DATA: l_ts_out TYPE timestamp.

GET TIME STAMP FIELD l_ts.

* 3600s zum Zeitstempel hinzurechnen
l_ts_out = cl_abap_tstmp=>add( tstmp = l_ts
                               secs = 3600 ).

WRITE: / l_ts TIME ZONE sy-zonlo.
WRITE: / l_ts_out TIME ZONE sy-zonlo.

Variante 2 (cl_hrpad_date_computations)

* add_weeks_to_date             -> Addiert Anzahl Wochen zum Datum
* add_months_to_date            -> Addiert Anzahl Monate zum Datum
* add_years_to_date             -> Addiert Anzahl Jahre zum Datum
* subtract_weeks_from_date      -> Subtrahiert Anzahl Wochen vom Datum
* subtract_months_from_date     -> Subtrahiert Anzahl Monate vom Datum
* subtract_years_from_date      -> Subtrahiert Anzahl Jahre vom Datum
* get_weekday_number            -> Ermittelt Nummer des Wochentags
* get_weekday_number_shifted    -> Ermittelt Nummer des Wochentags (verschoben)
* get_first_day_calendar_week   -> Ermittelt den ersten Tag einer Kalenderwoche für best. Jahr
* get_last_weekday_number       -> Bestimmt Nummer des letzten Wochentags
* get_first_day_in_week         -> Ermittelt den ersten Tag einer Woche
* get_first_day_in_shifted_week -> Ermittelt den ersten Tag einer Woche (verschoben)
* get_first_day_previous_month  -> Ermittelt den ersten Tag im davorliegenden Monat
* get_week                      -> Ermittelt die Woche in der das Datum liegt (verschoben)
* get_shifted_week              -> Ermittelt die Woche in der das Datum liegt (verschoben)
* get_last_day_in_month         -> Berechnet den letzten Tag des laufenden Monats
* get_last_day_previous_month   -> Ermittelt den letzten Tag des davorliegenden Monats
* get_days_per_year             -> Ermittelt Anzahl der Tage pro Jahr

Variante 3 (cl_bs_period_toolset_basics)

* erster Tag des aktuellen Monats
DATA(lv_first_day) = cl_bs_period_toolset_basics=>get_first_day_in_month( iv_date = sy-datum ).
WRITE: / lv_first_day.

* erster Tag des vorherigen Monats
DATA(lv_first_day) = cl_bs_period_toolset_basics=>get_first_day_prev_month( iv_date = sy-datum ).
WRITE: / lv_first_day.

* letzter Tag des vorherigen Monats
DATA(lv_last_day) = cl_bs_period_toolset_basics=>get_last_day_prev_month( iv_date = sy-datum ).
WRITE: / lv_last_day.

* letzter Tag des aktuellen Monats
DATA(lv_last_day) = cl_bs_period_toolset_basics=>get_last_day_in_month( iv_date = sy-datum ).
WRITE: / lv_last_day.

* 60 Minuten zu Zeit und Datum hinzurechnen
cl_bs_period_toolset_basics=>add_minutes_to_date( EXPORTING
                                                    iv_date    = sy-datum
                                                    iv_time    = sy-uzeit
                                                    iv_minutes = 60
                                                  IMPORTING
                                                    ev_date    = DATA(lv_date_new)
                                                    ev_time    = DATA(lv_time_new) ).

WRITE: / lv_date_new, lv_time_new.

[ABAP] Datentypen für Zeitdarstellung und deren Verwendung

DATA: lv_dt TYPE d.           " Datum (YYYYMMDD)
DATA: lv_tm TYPE t.           " Zeit (HHMMSS)
DATA: lv_ts TYPE timestamp.   " Zeitstempel kurz (YYYYMMDDhhmmss)
DATA: lv_tsl TYPE timestampl. " Zeitstempel lang (YYYYMMDDhhmmss,mmmuuun)

* Systemzeit holen
lv_tm = sy-uzeit.

* Systemdatum holen
lv_dt = sy-datum.

* Zeitstempel kurz holen
GET TIME STAMP FIELD lv_ts.

* Zeitstempel lang holen
GET TIME STAMP FIELD lv_tsl.

* Zeit formatiert ausgeben
WRITE: / lv_dt MM/DD/YYYY.

* Datum formatiert ausgeben
WRITE: /(8) lv_tm USING EDIT MASK '__:__:__'.

* Zeitstempel kurz entsprechend der lokalen Zeitzone des Users ausgeben
WRITE: / lv_ts TIME ZONE sy-zonlo.

* Zeitstempel lang entsprechend der lokalen Zeitzone des Users ausgeben
WRITE: / lv_tsl TIME ZONE sy-zonlo.

[ABAP] Laufzeitmessung von ABAP-Code

Variante 1

DATA(o_timer) = cl_abap_runtime=>create_hr_timer( ).
DATA(usec_start) = o_timer->get_runtime( ).

...

DATA(usec_end) = o_timer->get_runtime( ).
DATA(usec) = CONV decfloat16( usec_end - usec_start ).
DATA(sec) = usec / 1000000.

Variante 2

DATA: usec_start TYPE i.
DATA: usec_end TYPE i.
DATA: usec TYPE i.

GET RUN TIME FIELD usec_start. " Startzeitpunkt

...

GET RUN TIME FIELD usec_end. " Endzeitpunkt

usec = ( usec_end - usec_start ).

WRITE: / | { usec }µs |.