News

UTC 무시하면 큰일 — ABAP TIMESTAMP 타임존 처리

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

아직 댓글이 없습니다.