SAP ABAP - 日期和时间
简述
ABAP 隐式引用了在世界大部分地区有效的公历。我们可以将输出转换为特定于国家/地区的日历。日期是相对于日历指定为精确的日、周或月的时间。时间被指定为相对于一天的精确秒或分钟。ABAP 始终以 24 小时格式保存时间。输出可以具有特定于国家/地区的格式。
日期和时间通常被解释为当前时区有效的本地日期。
ABAP 提供了两种内置类型来处理日期和时间 -
- D 数据类型
- T 数据类型
以下是基本格式 -
ABAP
DATA: lv_date TYPE D,
lv_time TYPE T.
DATA: lv_year TYPE I,
lv_month TYPE I,
lv_day TYPE I,
lv_ hour TYPE I,
lv_minute TYPE I,
lv_second TYPE I.
这两种类型都是固定长度字符类型,其形式分别为 YYYYMMDD 和 HHMMSS。
时间戳
除了这些内置类型之外,另外两种类型TIMESTAMP 和TIMESTAMPL在许多标准应用程序表中使用 UTC 格式存储时间戳。下表显示了 ABAP 中可用的基本日期和时间类型。
序号 | 数据类型和描述 |
---|---|
1 | DYYYYMMDD 形式的内置固定长度日期类型。例如,值 20150913 表示日期 2015 年 9 月 13 日 |
2 | THHMMSS 形式的内置固定长度时间类型。例如,值 172305 表示时间 17:23:05 |
3 | TIMESTAMP (类型 P -- 长度 8 无小数)该类型用于以 YYYYMMDDhhmmss 形式表示短时间戳。例如,值 20100913102305 表示日期 2010 年 9 月 13 日上午 10:23:05。 |
4 | TIMESTAMPL (P 型 - 长度 11 位小数 7)TIMESTAMPL 表示 YYYYMMDDhhmmss,mmmuuun 形式的长时间戳。这里附加的数字"mmmuuun"代表秒的分数。 |
当前日期和时间
以下代码片段检索当前系统日期和时间。
ABAP
REPORT YR_SEP_15.
DATA: date_1 TYPE D.
date_1 = SY-DATUM.
Write: / 'Present Date is:', date_1 DD/MM/YYYY.
date_1 = date_1 + 06.
Write: / 'Date after 6 Days is:', date_1 DD/MM/YYYY.
上面的代码产生以下输出:
vbnet
Present Date is: 21.09.2015
Date after 6 Days is: 27.09.2015
变量 date_1
被赋予当前系统日期 SY-DATUM
的值。接下来,我们将日期值增加 6。就 ABAP 中的日期计算而言,这意味着我们将日期对象的日期部分增加 6 天。ABAP 运行时环境非常智能,可以在日期值到达月底时滚动该日期值。
时间计算的工作方式与日期计算类似。以下代码使用基本时间算术将当前系统时间增加 75 秒。
vbnet
```
REPORT YR_SEP_15.
DATA: time_1 TYPE T.
time_1 = SY-UZEIT.
Write /(60) time_1 USING EDIT MASK
'Now the Time is: __:__:__'.
time_1 = time_1 + 75.
Write /(60) time_1 USING EDIT MASK
'A Minute and a Quarter from Now, it is: __:__:__'.
```
上面的代码产生以下输出 -
csharp
```
Now the Time is 11:45:05
A Minute and a Quarter from Now, it is: 11:46:20
```
使用时间戳
您可以检索当前系统时间并将其存储在时间戳变量中使用GET TIME STAMP如下面的代码所示。GET TIME STAMP 语句根据所使用的时间戳数据对象的类型以长记或简写格式存储时间戳。时间戳值使用 UTC 标准进行编码。
vbnet
REPORT YR_SEP_12.
DATA: stamp_1 TYPE TIMESTAMP,
stamp_2 TYPE TIMESTAMPL.
GET TIME STAMP FIELD stamp_1.
Write: / 'The short time stamp is:', stamp_1 TIME ZONE SY-ZONLO.
GET TIME STAMP FIELD stamp_2.
Write: / 'The long time stamp is:', stamp_2 TIME ZONE SY-ZONLO.
上面的代码产生以下输出 -
csharp
The short time stamp is: 18.09.2015 11:19:40
The long time stamp is: 18.09.2015 11:19:40,9370000
在上面的示例中,我们使用 WRITE 语句的 TIME ZONE
添加来显示时间戳。此添加根据指定时区的规则格式化时间戳的输出。系统字段 SY-ZONLO
用于显示用户首选项中配置的本地时区。
通用外部格式转内部时间格式
我们在接受外部系统的日期格式通常是 2025-08-27,或者是2025.08.27,或者是 2025/08/27 这类的格式,需要将这类日期转换为 20250827,下面写了通用的 FM,可以实现外部日期格式的识别,并转换为内部格式的日期格式。
外部时间格式一般都带冒号 :
,因此也要转换为不带格式的时间,代码如下:
ABAP
FUNCTION z_date_convert_input.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(IV_DATUM) TYPE STRING OPTIONAL
*" REFERENCE(IV_UZEIT) TYPE STRING OPTIONAL
*" EXPORTING
*" REFERENCE(EV_DATUM) TYPE SY-DATUM
*" REFERENCE(EV_UZEIT) TYPE SY-UZEIT
*"----------------------------------------------------------------------
DATA: lv_str2 TYPE char1.
DATA: lv_str1 TYPE string,
lv_str3 TYPE string,
lv_str4 TYPE string,
lv_len TYPE i.
DATA: lt_str LIKE TABLE OF lv_str1.
IF iv_datum IS NOT INITIAL.
IF '/.-\' CA iv_datum.
lv_str2 = iv_datum+4(1).
SPLIT iv_datum AT lv_str2 INTO TABLE lt_str.
LOOP AT lt_str INTO lv_str1.
lv_len = strlen( lv_str1 ).
IF lv_len EQ 1.
CONCATENATE lv_str3 '0' lv_str1 INTO lv_str3.
ELSE.
CONCATENATE lv_str3 lv_str1 INTO lv_str3.
ENDIF.
CLEAR: lv_str1.
ENDLOOP.
ev_datum = lv_str3.
ELSE.
ev_datum = iv_datum.
ENDIF.
ENDIF.
IF '::' CA iv_uzeit.
CLEAR: lt_str[].
lv_str2 = iv_uzeit+2(1).
IF '::' CA lv_str2.
SPLIT iv_uzeit AT lv_str2 INTO TABLE lt_str.
ELSE.
lv_str2 = iv_uzeit+1(1).
SPLIT iv_uzeit AT lv_str2 INTO TABLE lt_str.
ENDIF.
LOOP AT lt_str INTO lv_str1.
lv_len = strlen( lv_str1 ).
IF lv_len EQ 1.
CONCATENATE lv_str4 '0' lv_str1 INTO lv_str4.
ELSE.
CONCATENATE lv_str4 lv_str1 INTO lv_str4.
ENDIF.
CLEAR: lv_str1.
ENDLOOP.
ev_uzeit = lv_str4.
ELSE.
ev_uzeit = iv_uzeit.
ENDIF.
ENDFUNCTION.
测试图如下:

