【问题标题】:How to convert 'YYYY-MM-DD hh:mm:ss.mmmmmm' (timezone CET (Amsterdam) and with DST) to 'CICS ABSTIME'?如何将“YYYY-MM-DD hh:mm:ss.mmmmmm”(时区 CET(阿姆斯特丹)和 DST)转换为“CICS ABSTIME”?
【发布时间】:2020-01-17 15:34:38
【问题描述】:

我需要用 CICS ABSTIME 填充 PIC S9(15) COMP-3 变量。 (我相信这是自 1900 年开始以来经过的毫秒数)

我的输入格式为YYYY-MM-DD hh:mm:ss.mmmmmm。 这表示 CET 时区(阿姆斯特丹)中的时间戳,并遵循夏令时 ('DST')。

我找到了部分解决方案:

EXEC CICS CONVERTTIME
     DATESTRING ('Tuesday, 09-Oct-07 04:57:43 GMT')
     ABSTIME (WS-TIMESTAMP)
END-EXEC

ABSTIME 中的结果+003400898263000

但是 CONVERTTIME 只能处理 4 种日期格式类型(RFC 1123、RFC 3339、RFC 850、ASCtime),它们都不能同时处理时区和自动 DST 看: https://www.ibm.com/support/knowledgecenter/SSGMCP_5.4.0/reference/commands-api/dfhp4_converttime.html

将日期(包括时区和 DST)转换为 ABSTIME 的正确 Cobol (/CICS) 方法是什么?

【问题讨论】:

  • 鉴于 DST 可能会根据政治上的挥霍而改变,今年的 DST 可能在去年可能并非如此。对于您的问题,您是否关心转换日期生效的 DST?从编程上讲,您可能需要调整算法。听起来您需要一张 DST 何时生效并在您所在地区收回的地图

标签: datetime type-conversion cobol cics


【解决方案1】:

我同意 Hogstrom 的观点,即夏季/冬季(日光/标准)时间变化已经发生变化,并且会受到未来变化的影响,因此从根本上说,这是一个需要解决和重新解决的数据驱动问题。如果您关心闰秒,那是一个类似的问题。如果您关心最近的历史时间,荷兰有这些有趣的时区偏移(此处为标准时间):

1909 年 5 月 1 日至 1937 年 7 月 1 日:UTC+0h19m32.13s(是的,认真的)

1937 年 7 月 1 日至 1940 年 5 月 16 日:UTC+0h20m

荷兰从 1916 年到 1945 年观察到 DST,从 1946 年到 1976 年停止观察它,然后从 1977 年再次开始观察它。荷兰可能在这些年没有按照相同的日期规则始终如一地开始/结束 DST应用夏令时时。 (我不确定那部分。)欧盟目前正在就协调时区和可能摆脱夏季/冬季时间变化进行积极辩论,因此提前计划是合理的,尽量避免嵌入 Y2K 式这个解决方案中的问题。无论您做什么,您都希望尝试让您的代码合理地面向未来。

好的,在这样的背景下,如果这个时间相关数据的提供者坚持提供当地的阿姆斯特丹时间而不是帮助你解决 UTC,我认为你应该有某种输入文件、参数列表或表格它定义了如何从阿姆斯特丹当地时间转换为 UTC。如果/当显示早于 1977 年 1 月 1 日的日期/时间时,您可能希望抛出错误。如果您的应用程序支持某种类型的跟踪或日志记录,我会写出有关本地时间到 UTC 时间转换规则集最后时间的信息更新。我还会在文件/表/规则集中放置某种日期代码注释/版本信息。首先以编程方式应用该输入文件中定义的规则,然后将 UTC 传递到上面的代码中。如果您想花哨一点(以一种好的方式),您可以在 BRMS 中定义时区/DST 规则,例如 IBM Operational Decision Manager (ODM) for z/OS(如果您有)(可能已经有这样的规则) ),然后从 COBOL 调用 BRMS。

另一种可能性是使用 java.time 将本地时区/DST 转换为 UTC。本文解释了这是如何完成的:

https://www.baeldung.com/java-daylight-savings

当然,您可以在 CICS 中运行 Java 程序(确实非常好),并且 Java 标准版是基本 z/OS 操作系统的一部分,免费提供和支持。 (Liberty Profile 也是 CICS Transaction Server 的一部分,虽然这很简单,您不需要 Liberty。)

这里的危险在于,如果 Java 分销商(在这种情况下是 IBM)或者更可能的是系统操作员没有保持 Java 运行时的最新状态,那么您的程序可能会在任何时候应用从本地到 UTC 的过时转换规则有人决定在未来改变规则。所以我不情愿地更喜欢某种基于输入规则文件/表/参数列表的方法。

好的,输入什么文件/表格/参数列表?那么,IANA 的时区数据库将是一个非常好的选择:

https://data.iana.org/time-zones/tz-link.html

您的代码可能只需要处理该数据库的一小部分,但作为“事实来源”,它是一个很好的选择。

【讨论】:

  • 令人印象深刻。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-10-22
  • 2011-03-18
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多