ABAP에서 타임존을 무시하면 생기는 문제
SAP 시스템은 전 세계 여러 타임존에서 동시에 운영됩니다. ABAP에서 TIMESTAMP 처리 시 타임존을 고려하지 않으면 한국(KST, UTC+9)에서 생성된 타임스탬프가 미국(EST, UTC-5)에서 14시간 차이로 보이거나, 날짜 경계에서 데이터가 잘못된 날에 기록될 수 있습니다.
ABAP 타임스탬프 타입 이해
" ABAP에서 사용하는 타임스탬프 타입
" TIMESTAMP (DATS + TIMS 조합): 로컬 시간 또는 UTC 혼용 위험
" TIMESTAMPL (고정밀 UTC 타임스탬프): 항상 UTC
" 현재 시간 조회
DATA: lv_ts TYPE timestamp, " YYYYMMDDHHmmSS
lv_tsl TYPE timestampl, " YYYYMMDDHHmmSS.nnnnnnn
lv_date TYPE d,
lv_time TYPE t.
" UTC 기준 현재 시간
GET TIME STAMP FIELD lv_tsl. " 항상 UTC
WRITE lv_tsl.
" 시스템 로컬 시간 (서버의 타임존 설정에 따라 다름!)
GET TIME.
lv_date = sy-datum.
lv_time = sy-uzeit.
" 위험: 서버 타임존에 따라 다른 값이 나올 수 있음
타임존 변환: CL_ABAP_TSTMP 클래스 활용
" UTC → 로컬 시간 변환
DATA: lv_utc_ts TYPE timestampl,
lv_local_ts TYPE timestampl.
" 현재 UTC 시간 저장
GET TIME STAMP FIELD lv_utc_ts.
" UTC → 한국 시간(KST, UTC+9)으로 변환
cl_abap_tstmp=>move_to_short(
EXPORTING
utc = lv_utc_ts
tzone = 'KST' " 타임존 코드
IMPORTING
datlo = DATA(lv_date_kst)
timlo = DATA(lv_time_kst)
).
WRITE: / '한국 시간:', lv_date_kst, lv_time_kst.
" UTC → 뉴욕 시간(EST)으로 변환
cl_abap_tstmp=>move_to_short(
EXPORTING
utc = lv_utc_ts
tzone = 'EST'
IMPORTING
datlo = DATA(lv_date_ny)
timlo = DATA(lv_time_ny)
).
WRITE: / '뉴욕 시간:', lv_date_ny, lv_time_ny.
로컬 시간 → UTC 변환 (저장 시 필수)
" 사용자 입력 로컬 시간을 UTC로 변환 후 저장
DATA: lv_user_date TYPE d,
lv_user_time TYPE t,
lv_utc_ts TYPE timestampl.
" 사용자 입력 (로컬 한국 시간)
lv_user_date = '20260515'.
lv_user_time = '090000'. " 09:00 KST
" 로컬 → UTC 변환
cl_abap_tstmp=>move_to_short_utc(
EXPORTING
datlo = lv_user_date
timlo = lv_user_time
tzone = 'KST'
IMPORTING
utc = lv_utc_ts
).
" lv_utc_ts = 2026-05-15 00:00:00 UTC (KST는 UTC+9이므로)
" UTC로 DB에 저장
INSERT INTO zbtp_event_log
VALUES( 'EVT-001', lv_utc_ts, 'CREATED' ).
사용자 타임존 자동 읽기
" 현재 로그인 사용자의 타임존 자동 확인
DATA lv_user_tz TYPE timezone.
cl_abap_context_info=>get_user_time_zone(
RECEIVING r_timezone = lv_user_tz
).
" lv_user_tz = 'KST' (사용자 설정에 따라)
" 사용자 타임존으로 UTC 변환
cl_abap_tstmp=>move_to_short(
EXPORTING
utc = lv_utc_ts
tzone = lv_user_tz " 사용자 타임존 자동 적용
IMPORTING
datlo = DATA(lv_display_date)
timlo = DATA(lv_display_time)
).
타임스탬프 계산 및 비교
" 두 타임스탬프의 차이 계산
DATA: lv_ts_start TYPE timestampl,
lv_ts_end TYPE timestampl,
lv_diff_sec TYPE p DECIMALS 7.
GET TIME STAMP FIELD lv_ts_start.
" ... 작업 수행 ...
GET TIME STAMP FIELD lv_ts_end.
" 초 단위 차이
cl_abap_tstmp=>subtract(
EXPORTING
tstmp1 = lv_ts_end
tstmp2 = lv_ts_start
RECEIVING
r_secs = lv_diff_sec
).
WRITE: / '처리 시간(초):', lv_diff_sec.
" n초 후 타임스탬프
DATA lv_future TYPE timestampl.
cl_abap_tstmp=>add(
EXPORTING
tstmp = lv_ts_start
secs = 3600 " 1시간 = 3600초
RECEIVING
r_tstmp = lv_future
).
공식 문서
ABAP 타임스탬프 처리는 ABAP Keyword Documentation — Timestamps와 CL_ABAP_TSTMP 클래스 API에서 확인하세요.
댓글 0
아직 댓글이 없습니다.