abapGit/src/utils/zcl_abapgit_time.clas.abap
mariusraht2 02204d07b4 Improved time conversion (#3096)
* Create pull.yml

* Update zcl_abapgit_git_transport.clas.abap

* Update zcl_abapgit_git_transport.clas.abap

* Update pull.yml

* Delete pull.yml

* Improved time conversion

Preparation for #3040

> rename time%3D>get to time%3D>get_unix
> added time conversion from unix to real (get_real)
> added unit tests for time conversion

* abapLint

* Raise cx_static_check and removed exc handling
2019-12-02 09:28:41 +01:00

101 lines
2.1 KiB
ABAP

CLASS zcl_abapgit_time DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
TYPES: ty_unixtime TYPE c LENGTH 16.
CLASS-METHODS get_unix
IMPORTING iv_date TYPE sydatum DEFAULT sy-datum
iv_time TYPE syuzeit DEFAULT sy-uzeit
RETURNING VALUE(rv_time) TYPE ty_unixtime
RAISING zcx_abapgit_exception.
CLASS-METHODS get_utc
IMPORTING iv_unix TYPE ty_unixtime
EXPORTING ev_date TYPE sydatum
ev_time TYPE syuzeit.
PROTECTED SECTION.
PRIVATE SECTION.
CONSTANTS: c_epoch TYPE d VALUE '19700101'.
ENDCLASS.
CLASS zcl_abapgit_time IMPLEMENTATION.
METHOD get_unix.
DATA: lv_i TYPE i,
lv_tz TYPE tznzone,
lv_utcdiff TYPE tznutcdiff,
lv_utcsign TYPE tznutcsign.
lv_i = iv_date - c_epoch.
lv_i = lv_i * 86400.
lv_i = lv_i + iv_time.
CALL FUNCTION 'TZON_GET_OS_TIMEZONE'
IMPORTING
ef_timezone = lv_tz.
CALL FUNCTION 'TZON_GET_OFFSET'
EXPORTING
if_timezone = lv_tz
if_local_date = iv_date
if_local_time = iv_time
IMPORTING
ef_utcdiff = lv_utcdiff
ef_utcsign = lv_utcsign
EXCEPTIONS
conversion_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'Timezone error' ).
ENDIF.
CASE lv_utcsign.
WHEN '+'.
lv_i = lv_i - lv_utcdiff.
WHEN '-'.
lv_i = lv_i + lv_utcdiff.
ENDCASE.
rv_time = lv_i.
CONDENSE rv_time.
rv_time+11 = lv_utcsign.
rv_time+12 = lv_utcdiff.
ENDMETHOD.
METHOD get_utc.
DATA: lv_i TYPE i,
lv_tz TYPE tznzone,
lv_utcdiff TYPE tznutcdiff,
lv_utcsign TYPE tznutcsign.
lv_i = iv_unix(10).
lv_utcsign = iv_unix+11.
lv_utcdiff = iv_unix+12.
" GMT + time-zone
CASE lv_utcsign.
WHEN '+'.
lv_i = lv_i + lv_utcdiff.
WHEN '-'.
lv_i = lv_i - lv_utcdiff.
ENDCASE.
ev_time = lv_i MOD 86400.
lv_i = lv_i - ev_time.
lv_i = lv_i / 86400.
ev_date = lv_i + c_epoch.
ENDMETHOD.
ENDCLASS.