ABAP:如何将天数添加到 TIMESTAMP 类型的日期
ABAP: How to add days to a date of type TIMESTAMP
在 ABAP 编程语言中,如何将 TIMESTAMP
类型的时间增加 1 天并使 month/year 正确滚动?
例如:
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'
我不确定它是否有效,但也许值得一试。
提取时间戳的日期,在日期上加一天,然后用新日期和时间戳的其余部分创建一个新的时间戳。
类似
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.
我不确定它是否会起作用 "as is",但我很确定你可以找到一种方法让它从那里起作用......而我们都在等待正确的答案;)
您可以使用 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.
这里有一个适合您的解决方案。您的系统中应该可用的功能模块是 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.
看完 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.
如果您不想恢复旧的程序化编程,您可以使用 class CL_ABAP_TSTMP
,如 documentation 中所述。
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
是私有的...但是,嘿,至少这让你思考了如何处理闰年...)
在 ABAP 编程语言中,如何将 TIMESTAMP
类型的时间增加 1 天并使 month/year 正确滚动?
例如:
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'
我不确定它是否有效,但也许值得一试。
提取时间戳的日期,在日期上加一天,然后用新日期和时间戳的其余部分创建一个新的时间戳。
类似
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.
我不确定它是否会起作用 "as is",但我很确定你可以找到一种方法让它从那里起作用......而我们都在等待正确的答案;)
您可以使用 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.
这里有一个适合您的解决方案。您的系统中应该可用的功能模块是 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.
看完 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.
如果您不想恢复旧的程序化编程,您可以使用 class CL_ABAP_TSTMP
,如 documentation 中所述。
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
是私有的...但是,嘿,至少这让你思考了如何处理闰年...)