如何在DelphiXe5 DataSnap Rest中使用TDateTime参数

如何在DelphiXe5 DataSnap Rest中使用TDateTime参数,delphi,datasnap,Delphi,Datasnap,我创建了一个DelphiXe5 DataSnap Rest服务器(使用FireDac组件) 到目前为止,所有工作正常,但接收TDATETIME作为参数除外 经过一些研究,我了解到这种类型的数据在DataSnap中是不可用的(至少是直接的) 我想做一个基本函数,如下所示: InsertCustomer(aID : Integer; aDateOfBirth : TDateTime) : Integer; 因为我不能使用TDateTime,我如何才能使用此函数 我的想法(请求)是在从TDataSe

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

到目前为止,所有工作正常,但接收TDATETIME作为参数除外

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

我想做一个基本函数,如下所示:

InsertCustomer(aID : Integer; aDateOfBirth : TDateTime) : Integer;
因为我不能使用TDateTime,我如何才能使用此函数

我的想法(请求)是在从TDataSet导出的字段中放置类似的内容(标识)


当从TDataSet导出列TDateTime时,如下所示。。。[“2013-10-10 10:47:40.0”]

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

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

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单元,但是请注意此函数仅适用于包含完整时区信息的完整ISO8601字符串(结束部分为+01:00或-05:00)。对于您的示例ISO8601 datetime,它的作用就像您以UTC时间给出时间一样,它将尝试将其转换为本地时间的TDateTime值。

tks以获取答案。。。所以我想它应该是字符串,因为在出现错误的情况下,它更容易让人阅读。主要的问题是,根本没有一种公认的标准方式来传输日期。REST并不是一个可靠的标准,它只是用来描述HTTP RPC API的通用术语。JSON也没有明确定义标准日期格式。这就是为什么您必须自己决定支持哪些API。您可以定义您的方法,以便年、月、日等是单独的整数参数。然后相应的HTTP调用如下所示:/datasnap/rest/TMyController/InsertCustomer/252/2014/2/4/17/36