我创建了一个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”]
答案 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值。