【问题标题】:How to use TDateTime parameters in Delphi XE5 DataSnap Rest如何在 Delphi XE5 DataSnap Rest 中使用 TDateTime 参数
【发布时间】:2014-02-04 15:49:57
【问题描述】:

我创建了一个 Delphi XE5 DataSnap Rest 服务器(使用 FireDac 组件)。

目前一切正常,除了接收 TDATETIME 作为参数。

经过一些研究,我了解到这种类型的数据在 DataSnap 中不可用(至少是直接的)。

所以我想做一个这样的基本功能:

InsertCustomer(aID : Integer; aDateOfBirth : TDateTime) : Integer;

由于无法使用 TDateTime,我该如何实现此功能...

我的想法(请求)是将类似(相同)的内容与从 TDataSet 导出的字段放在一起。

当从 TDataSet 中导出一列 TDateTime 时是这样的... ["2013-10-10 10:47:40.0"]

【问题讨论】:

    标签: delphi datasnap


    【解决方案1】:

    没有使用 url 参数或 JSON 传输日期和时间的标准方法。请记住,TDateTime 在幕后实际上是一个double,因此像在您的示例中那样定义方法,参数应该在 url 中作为浮点数给出。

    如果您想接受一个日期作为 ISO8601 字符串,您必须将参数定义为 string 类型并手动进行转换。这是我在自己的代码中使用的一个函数来解决这类问题。

    uses
      Soap.XSBuiltIns;
    
    function ISODateStrToDate(DateStr: string): TDateTime;
    var
      xsDate: TXSDate;
    begin
      xsDate := TXSDate.Create;
      try
        xsDate.XSToNative(DateStr);
        Exit(xsDate.AsDate);
      finally
        xsDate.Free;
      end;
    end;
    

    此函数会丢弃 ISO8601 字符串的时间部分。大多数情况下我不需要它。

    如果你需要时间部分,你可以使用

    function XMLTimeToDateTime(const XMLDateTime: InvString; AsUTCTime: Boolean = False): TDateTime;
    

    这是来自同一个 Soap.XSBuiltIns 单元,但是 注意! 此函数仅适用于包含完整时区信息(+01:00 或 -05:00)的完整 ISO8601 字符串结束部分)。对于您的示例 ISO8601 日期时间,它的行为就像您已经给出了 UTC 时间的时间,它会尝试将其转换为本地时间的 TDateTime 值。

    【讨论】:

    • tks for answer ...所以我猜这将是字符串,因为在出​​现错误时更“人类可读”。
    • 主要问题是根本没有公认的标准方式来转移日期。 REST 不是一个可靠的标准,它只是用于描述 HTTP RPC API 的包罗万象的术语。 JSON 也没有明确定义标准日期格式。这就是为什么你必须自己决定你的 API 支持什么。您可以定义您的方法,使年、月、日等成为单独的整数参数。然后相应的 HTTP 调用将如下所示:/datasnap/rest/TMyController/InsertCustomer/252/2014/2/4/17/36
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多