ABAP:如何将日期添加到TIMESTAMP类型的日期

Jon*_*enn 3 abap datetime

在ABAP编程语言中,如何在类型的时间添加1天TIMESTAMP并正确地滚动月份/年?

例如:

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'
Run Code Online (Sandbox Code Playgroud)

vwe*_*ert 7

如果您不打算恢复旧的过程式编程,则可以使用文档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  )
).
Run Code Online (Sandbox Code Playgroud)

(太糟糕CL_ABAP_TSTMP=>SECSOFDAY了,这是私人的......但是,嘿,至少这让你思考如何处理闰年......)


Jon*_*enn 6

在看了Jagger的回答后,我查看了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.
Run Code Online (Sandbox Code Playgroud)

  • 我仍然认为调用功能模块是一个更好的主意.:) (2认同)
  • 一般经验法则:SAP表示不使用"未发布"的功能模块(即有一天,SAP可以在没有警告的情况下将其删除或将其标记为过时).CONVERT已发布并记录在案.而CONVERT要快得多. (2认同)

Jag*_*ger 5

这是一个应该适合您的解决方案。您的系统中应该可用的功能模块是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.
Run Code Online (Sandbox Code Playgroud)