将 DD-MMM-YYYY HH:MM:SS.SSS 转换为进度 DATETIME-TZ

Convert DD-MMM-YYYY HH:MM:SS.SSS to Progress DATETIME-TZ

是否有一种简单的方法可以将格式为 DD-MMM-YYYY HH:MM:SS.SSS 的日期时间值转换为 Progress DATETIME-TZ。例如,我试图将“15-Sep-2017 20:51:14.566”日期存储到 Progress ABL 变量中,其数据类型为 datetime-tz,格式为“99/99/9999 HH:MM:SS.SSS+ HH:MM".

我可以通过将日期、月份、年份、小时、分钟等拆分为单个变量并使用 DATE、DATETIME 等函数组合它们来实现此功能。但是,我相信应该有一些好的方法来做到这一点。谢谢你的帮助。

不用担心进度显示格式 - 只要将字符串转换为 datetime-tz 以后就可以随时使用显示格式。

在这种情况下,我认为您需要按照 "hard" 的方式进行。这是让您入门的东西。

DEFINE VARIABLE cDateString AS CHARACTER NO-UNDO.
DEFINE VARIABLE dtDate      AS DATETIME-TZ NO-UNDO.

FUNCTION convertDateString RETURNS DATETIME-TZ (INPUT pcString AS CHARACTER):

    DEFINE VARIABLE dtDateTz AS DATETIME-TZ NO-UNDO.
    DEFINE VARIABLE cDateTz  AS CHARACTER NO-UNDO.
    DEFINE VARIABLE iMonth AS INTEGER NO-UNDO.    

    CASE ENTRY(2, pcString, "-"):
        WHEN "Jan" THEN iMonth = 1.
        WHEN "Feb" THEN iMonth = 2.
        WHEN "Mar" THEN iMonth = 3.
        WHEN "Apr" THEN iMonth = 4.
        WHEN "May" THEN iMonth = 5.
        WHEN "Jun" THEN iMonth = 6.
        WHEN "Jul" THEN iMonth = 7.
        WHEN "Aug" THEN iMonth = 8.
        WHEN "Sep" THEN iMonth = 9.
        WHEN "Oct" THEN iMonth = 10.
        WHEN "Nov" THEN iMonth = 11.
        WHEN "Dec" THEN iMonth = 12.
    END CASE.

    IF iMonth = 0 THEN RETURN ?.

    ASSIGN 
        cDateTz = SUBSTRING(ENTRY(3, pcString, "-"), 1 ,4) + "-" + STRING(iMonth) + "-" + ENTRY(1, pcString, "-") + " " + ENTRY(2, pcString, " ").

    dtDateTz = DATETIME-TZ(cDateTz).

    RETURN dtDateTz.

END FUNCTION. 


cDateString = "15-Sep-2017 20:51:14.566".

dtDate = convertDateString(cDateString).

DISPLAY dtDate FORMAT "99/99/9999 HH:MM:SS.SSS+HH:MM".

我知道这是一个旧话题,但为了其他可能发现这个的人的利益:简单的变量赋值就可以了。

DEFINE VARIABLE dt  AS DATETIME.
DEFINE VARIABLE dtz AS DATETIME-TZ /* FORMAT "..." */.

dt = NOW.
dtz = dt.
DISPLAY dt SKIP dtz.

[编辑] 您可以使用会话变量 SESSION:TIMEZONE 来设置此分配中使用的时区。但在旧版本的 Progress 中存在问题,您可能需要使用启动参数 -useSessionTZ。请参阅进度知识库文章:Inconsistency assigning datetime-tz to datetime