gpt4 book ai didi

abap - 为什么在添加 DAYLIGHT SAVING TIME 时 CONVERT DATE 会因 sy-subrc 12 而失败?

转载 作者:行者123 更新时间:2023-12-04 23:12:00 24 4
gpt4 key购买 nike

以下代码失败并显示 sy-subrc=12 .

CONVERT DATE '20191105'
TIME '123000'
DAYLIGHT SAVING TIME 'X'
INTO TIME STAMP DATA(timestamp)
TIME ZONE 'CET '.

ABAP documentation它说:

12 : The specified time could not be converted, because dat, tim, or dst contain invalid or inconsistent values.



我注意到,当我在调试器中删除 sy-dayst 中的“X”时,它会进行转换。

但是我当然想考虑夏令时,所以我怎样才能做到这一点?

最佳答案

TL;博士

Never use DAYLIGHT SAVING TIME (except in very special cases if you're expert)



@konstantin 说得好:

"CONVERT DATE command automatically takes care of DST"



解释:
DAYLIGHT SAVING TIME 'X'仅当本地时间(DATE 和 TIME)匹配一小时(很少是两小时)间隔以从夏季时间切换到冬季时间时才能使用,对于给定的时区(请注意,某些时区没有夏令时) .

例如,2003 年,巴西在 3 月 9 日(星期日)凌晨 2 点切换到冬季时间;凌晨 2 点,时钟不得不拨回一小时到凌晨 1 点,因此凌晨 1 点 30 分出现了两次。

因此,如果 ABAP 必须将本地时间 2003/03/09 01:30:00 转换为 UTC 时间,它必须知道本地时间是否在夏令时(冬令时)期间(夏令时),分别对应 UTC 时间 2003/03/09 03:30:00 或 2003/03/09 04:30:00。

示范:
DATA: time_stamp TYPE timestamp,
dat TYPE d,
tim TYPE t,
tz TYPE ttzz-tzone.

tz = 'BRAZIL'. "UTC-03:00
dat = '20030309'.
tim = '013000'.

CONVERT DATE dat TIME tim DAYLIGHT SAVING TIME 'X' " winter time
INTO TIME STAMP time_stamp TIME ZONE tz.
ASSERT time_stamp = '20030309033000'. " UTC time

CONVERT DATE dat TIME tim DAYLIGHT SAVING TIME ' ' " summer time
INTO TIME STAMP time_stamp TIME ZONE tz.
ASSERT time_stamp = '20030309043000'. " UTC time

现在,问题是,如何知道 DAYLIGHT SAVING TIME 'X'必须使用或不使用。事实上,如果一个数据库表包含我在上面示例中使用的本地时间, 一个不知道无论是夏令时还是冬令时,因为夏令时从未与日期和时间列一起分配给表格列。

这就是为什么 SAP 在大约 10 年前推出了一个解决方案,它使 DAYLIGHT SAVING TIME几乎过时了。实际问题不是夏令时,而是可能导致时间排序等问题的非连续时间。解决的原理是在夏令时切换过程中将时间放慢,这样一个给定的时间就不会出现两次,时间保持连续。从技术上讲,它会影响系统变量 SY-DATUM (日期)和 SY-UZEIT (时间)。在这个“双小时”间隔中,需要两个实际秒才能产生一个 SAP 秒。默认情况下,此行为通过配置文件参数 zdate/DSTswitch_contloctime 激活(值为“on”)。您可以通过交易代码 RZ11查看.下面是按照旧方式(“off”)或新方式(“on”)的 SAP 时间,如果切换发生在本地时间凌晨 2 点(带“on”,则看不到切换):
off: 1:00, 1:30, 1:00, 1:30, 2:00
on : 1:00, 1:15, 1:30, 1:45, 2:00

只是为了增加复杂性,请注意 CONVERT还有一小时的差距。例如,使用 zdate/DSTswitch_contloctime设置为“开”且不带 DAYLIGHT SAVING TIME , CONVERT将分别给出这些 UTC 时间戳,03:59:59 和 05:00:00 之间有一个小时的间隔:
3:00, 3:15, 3:30, 3:45, 5:00

但与出现时间排序问题的风险相比,这种差距并不是一个大缺点。

更多信息: https://blogs.sap.com/2009/12/09/daylight-saving-time-and-slowing-down-the-time/SAP note 950114 - Profile parameter zdate/DSTswitch_contloctime .

请注意 SY-DAYST对应于应用服务器当前时间的 DST 指示符( SY-DATUMSY-UZEIT 和表 TTZCU 中定义的时区)。我看不出它有任何可能的用途。如果您想转换最初使用 SY-DATUM 获得的时间和 SY-UZEIT , 转换成 UTC 时间戳,你应该使用方法 SYSTEMTSTMP_SYST2UTC类(class) CL_ABAP_TSTMP .获取当前时间的示例:
cl_abap_tstmp=>systemtstmp_syst2utc(
EXPORTING
syst_date = sy-datum
syst_time = sy-uzeit
IMPORTING
utc_tstmp = DATA(now_utc) ).

正如@konstantin 所展示的(“DATE '20190331' TIME '023000' [...] 德国不存在本地时间”), CONVERT DATE没有 DAYLIGHT SAVING TIME可能返回 sy-subrc=12在极少数情况下,如果输入的日期和时间由于从冬季时间切换到夏季时间而对应于“消失时间”内的某个时间,则如果时区有 DST。例如:“at 2am, it is 3am”,本地时间“2:30am”根本不存在。

关于abap - 为什么在添加 DAYLIGHT SAVING TIME 时 CONVERT DATE 会因 sy-subrc 12 而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58416083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com