如何在Delphi XE5 DataSnap Rest中使用TDateTime参数

时间:2014-02-04 15:49:57

标签: delphi datasnap

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

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

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

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

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

如何创建此功能,因为我无法使用TDateTime ...

我的想法(请求)是对从TDataSet导出的字段添加类似(identic)的东西。

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

1 个答案:

答案 0 :(得分: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单元,但是警告!此功能仅适用于包含全时区信息的完整ISO8601字符串(+01:00或-05:00)结束部分)。对于您的示例ISO8601日期时间,它将表现为您以UTC时间给出时间,并且它将尝试将其转换为当地时间的TDateTime值。