【问题标题】:Convert DD-MMM-YYYY HH:MM:SS.SSS to Progress DATETIME-TZ将 DD-MMM-YYYY HH:MM:SS.SSS 转换为进度 DATETIME-TZ
【发布时间】:2019-05-31 20:28:31
【问题描述】:

有没有一种简单的方法可以将格式为 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 等函数组合它们来实现此功能。但是,我相信应该有一些好的方法来做到这一点。谢谢你的帮助。

【问题讨论】:

  • 我同意应该有,但到目前为止我还没有在 Progress 中找到有用的日期功能。我总是必须进行字符串操作或使用您描述的功能。

标签: openedge progress-4gl


【解决方案1】:

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

在这种情况下,我认为您需要以“硬”的方式进行操作。这里有一些东西可以帮助您入门。

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".

【讨论】:

    【解决方案2】:

    我知道这是一个旧线程,但为了其他可能会发现这一点的人的利益:简单的变量赋值将起作用。

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多