簡體   English   中英

ABAP:如何將日期添加到TIMESTAMP類型的日期

[英]ABAP: How to add days to a date of type TIMESTAMP

在ABAP編程語言中,如何在TIMESTAMP類型的時間內添加1天並正確地滾動月份/年?

例如:

data lv_time type TIMESTAMP value '20180228000000'.
data(lv_new_time) = lv_time + 1. " should be '20180301000000', but instead is '20180228000001'
data(lv_new_time2) = lv_time + 1000000. " should be '20180301000000', but instead is '20180229000000'

在查看Jagger的回答之后,我查看了TIMESTAMP_DURATION_ADD函數的TIMESTAMP_DURATION_ADD並發現了一些ABAP語法,它完成了這項工作而根本不需要函數調用。

constants: lc_time_zone type timezone value 'UTC'.
data lv_timestamp_before type timestamp value '20180228001234'.
data lv_timestamp_after type timestamp.
data lv_date like sy-datum.
data lv_time like sy-uzeit.

convert time stamp lv_timestamp_before time zone lc_time_zone
    into date lv_date time lv_time.
lv_date = lv_date + 1.
convert date lv_date time lv_time
    into time stamp lv_timestamp_after time zone lc_time_zone.

這是一個適合您的解決方案。 系統中應該可用的功能模塊是TIMESTAMP_DURATION_ADD

REPORT zzz.

DATA lv_time TYPE timestamp VALUE '20180228000000'.

START-OF-SELECTION.
  DATA timestamp_out TYPE timestamp.

  CALL FUNCTION 'TIMESTAMP_DURATION_ADD'
    EXPORTING
      timestamp_in    = lv_time
      timezone        = 'UTC'
      duration        = 1
      unit            = 'TAG' " day (in German)
    IMPORTING
      timestamp_out   = timestamp_out
    EXCEPTIONS
      timestamp_error = 1
      OTHERS          = 2.

  ASSERT sy-subrc = 0.

  WRITE timestamp_out.

如果您不想恢復舊的過程編程,則可以使用文檔中描述的CL_ABAP_TSTMP類。

DATA some_timestamp TYPE timestamp VALUE '20180228000000'.
DATA(new_timestamp) = cl_abap_tstmp=>add(
    tstmp = some_timestamp
    secs  = ( 365 * 24 * 60 * 60  )
).

(太糟糕了CL_ABAP_TSTMP=>SECSOFDAY是私人的...但是嘿,至少那會讓你想到如何處理閏年......)

您可以使用FM IAM_TIMESTAMP_CALC將一天添加到時間戳,結果將為20180301000000:

  DATA lv_time TYPE timestamp VALUE '20180228000000'.

  CALL FUNCTION 'IAM_TIMESTAMP_CALC'
    EXPORTING
      iv_refdate = lv_time
*     IV_XBACKWARD       =
      iv_days    = '1'
*     IV_HOURS   = '0'
*     IV_MINUTES = '0'
*     IV_SECONDS = '0'
    IMPORTING
      ev_date    = lv_time.

我不確定它是否會起作用,但也許值得一試。

提取時間戳的日期,將日期添加一天,然后使用新日期和時間戳的其余部分創建新的時間戳。

就像是

data: stamp type timestamp value '20180301000000000',
      stamp_date type dats,
      new_stamp type timestamp.
stamp_date = stamp(8). "if it doesn't work, just look for a FM
add 1 to stamp_date.
new_stamp = stamp_date && stamp+8.

我不確定它是否會“按原樣”起作用,但我很確定你能找到一種方法讓它在那里工作......而我們都在等待正確的答案;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM