【问题标题】:Difference between two datetime variables in PowerBuilderPowerBuilder 中两个日期时间变量之间的差异
【发布时间】:2020-09-02 16:57:25
【问题描述】:

我的 PowerBuilder (2017) 代码中有两个日期时间变量,如下所示:

var1 = "09/02/2020 23:59:59" var2 = "09/03/2020 00:00:02"

我需要以秒为单位找出这两个日期之间的差异(在本例中为 3 秒)我该怎么做?

--谢谢。

【问题讨论】:

    标签: powerbuilder


    【解决方案1】:

    这是一个简单的解决方案。

    ll_time1 = secondsafter(time(adt_start), time("23:59:59")) + 1

    ll_time2 = secondsafter(time("00:00:00"), time(adt_end))

    ll_retval = ll_time1 + ll_time2

    【讨论】:

    • 这并没有真正考虑到时间是在不同的日子。
    【解决方案2】:

    试试 SecondsAfter 方法,例如 ll_dif = SecondsAfter(var1, var2)

    或者,您可以使用 DateDiff 方法发出 sql 语句(SQL Server 使用 DateDiff(second, var1, var2),其他 DBMS 您必须查找)。

    【讨论】:

    • SecondsAfter 函数将 Time 变量作为参数,我还需要考虑日期。我期待以下结果: var1 = "09/02/2020 23:59:59" var2 = "09/03/2020 00:00:02" => 差异:3 秒 var1 = "09/02/2020 23: 59:59" var2 = "09/03/2020 23:59:59" => 差异:86400 秒
    【解决方案3】:

    计算日期之间的差异,然后计算时间之间的差异。

    这是一个来自“编辑源”的例子。

    global type gf_secondsafter from function_object
    end type
    
    forward prototypes
    global function long gf_secondsafter (readonly datetime adt_start, readonly datetime adt_end)
    end prototypes
    
    global function long gf_secondsafter (readonly datetime adt_start, readonly datetime adt_end);
    
    constant long lc_hours_in_day = 24, lc_minutes_in_hour = 60, lc_seconds_in_minute = 60
    
    date ld_start, ld_end
    time lt_start, lt_end
    
    long ll_days, ll_seconds, ll_result
    
    ld_start = date( adt_start )
    lt_start = time( adt_start )
    
    ld_end = date( adt_end )
    lt_end = time( adt_end )
    
    ll_days = DaysAfter( ld_start, ld_end )
    
    ll_seconds = SecondsAfter ( lt_start, lt_end )
    
    //This is the number of days multiplied by the number of seconds in a day
    ll_result = ll_days * lc_hours_in_day * lc_minutes_in_hour * lc_seconds_in_minute
    // Add the seconds from the time difference
    ll_result += ll_seconds
    
    
    return ll_result
    end function
    

    【讨论】:

      【解决方案4】:

      首先;我们将创建一个名为 relativedatetime_1second() 的辅助函数,返回 1 秒后的相对日期时间:

      global type relativedatetime_1second from function_object
      end type
      
      forward prototypes
      global function datetime relativedatetime_1second (date dt, time tm)
      end prototypes
      
      global function datetime relativedatetime_1second (date dt, time tm);
      
      time new_tm
      date new_dt
      
      
      //   return datetime after 1 second(s)
      
      new_tm = tm
      if new_tm = 23:59:59 then
          new_dt = RelativeDate(dt,1)
          new_tm = 00:00:00
      elseif new_tm = 00:00:00 then
          new_dt = dt
          new_tm = 00:00:01
      else
          new_dt = dt
          new_tm = RelativeTime(tm,1)
      end if
      return datetime(new_dt, new_tm)
      end function
      

      其次;创建一个名为 diffdatetime() 的递归函数,以秒为单位返回两个日期时间变量之间的差异:

      global type DiffDateTime from function_object
      end type
      
      forward prototypes
      global function long diffdatetime (datetime adt_date1, datetime adt_date2)
      end prototypes
      
      global function long diffdatetime (datetime adt_date1, datetime adt_date2);
      
      datetime new_dt, next_dt
      long seconds,   seconds1, period, remaining_period
      
      
      //   return diff in seconds between two datetime
      
      //suppose always date1 smaller otherwise return negative
      
      period = DaysAfter ( date(adt_date1), date(adt_date2) ) -1
      new_dt = adt_date1
      if period = -1 then //same day
          seconds = SecondsAfter ( time(adt_date1), time(adt_date2) )
      elseif period = 0 then //one day counts seconds one by one
          do 
              new_dt = relativedatetime_1second(date(adt_date1), time(adt_date1))
              adt_date1 = new_dt 
              seconds =seconds + 1
          loop until adt_date1 = adt_date2
      else //extract one day concept plus the remaining days-after
          next_dt = datetime(RelativeDate(date(adt_date1), 1), time(adt_date2))
          seconds1 = diffdatetime(adt_date1, next_dt)
      
      
          remaining_period = period  * 24 * 60 * 60 
      
          seconds = seconds1 + remaining_period
      end if
      return seconds
      end function
      

      最后;获取 datetime1 和 datetime2 之间的差异(每秒)如下:

      messagebox("Seconds", string(diffdatetime(var1, var2)))
      

      *注意:如果 datetime2 出现在 datetime1 之前,diffdatetime() 返回一个负数

      【讨论】:

        【解决方案5】:
        long ll_time1, ll_time2
        
        ll_time1 = secondsafter(time(adt_start), time("23:59:59")) + 1
        
        ll_time2 = secondsafter(time("00:00:00"), time(adt_end)) 
        
        return (ll_time1 + ll_time2)
        

        【讨论】:

        • 社区encourages 在代码旁边添加解释,而不是纯粹基于代码的答案。正如here 所解释的那样:“虽然此代码可能会回答问题,但提供有关 为什么 和/或 如何 此代码回答问题的附加上下文会提高其长期价值。 "另外,请查看formatting help page 以改进您的格式。
        猜你喜欢
        • 1970-01-01
        • 2023-03-24
        • 2011-10-29
        • 2021-10-21
        • 2021-11-25
        • 2011-08-01
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多