如何解析TDateTime从Delphi XE 10中的JSON字符串返回的日期时间

时间:2016-09-10 15:30:46

标签: json rest delphi delphi-10-seattle

我从请求中收到以下JSON:

{
  "cdPlayer": 3,
  "nmPlayer": "Player Name",
  "dtCreate": "2016-08-24T22:53:31.687",
  "dtChange": null,
  "idStatus": true
 }

我想将转换dtCreate和dtChange加载到TDateTime。如何正确地做到这一点?没有TJSONDateTime来投射GetValue。下面是我当前的代码,我将其转换为普通字符串。

procedure TfrmPrincipal.btnInfoClick(Sender: TObject);
var
  jsonRoot: TJSONObject;
  tokenRequest: TRESTRequest;
  tokenResponse: TRESTResponse;
  tokenClient: TRESTClient;
  tokenAutenticacao: TOAuth2Authenticator;
begin
  tokenClient := TRESTClient.Create(nil);
  tokenRequest := TRESTRequest.Create(nil);
  tokenResponse := TRESTResponse.Create(nil);
  tokenAutenticacao := TOAuth2Authenticator.Create(nil);
  try
    tokenRequest.Client := tokenClient;
    tokenRequest.Response := tokenResponse;
    tokenRequest.Method := TRESTRequestMethod.rmPUT;
    tokenClient.Authenticator := tokenAutenticacao;
    tokenAutenticacao.TokenType := TOAuth2TokenType.ttBEARER;
    tokenAutenticacao.AccessToken := 'token_string';
    tokenClient.BaseURL := 'http://host/url/method';
    tokenRequest.Execute;
    jsonRoot:= TJSONObject.ParseJSONValue(tokenResponse.JSONText) as TJSONObject;
    Memo1.Lines.Add('cdPlayer => ' + jsonRoot.GetValue('cdPlayer').Value);
    Memo1.Lines.Add('nmPlayer=> ' + jsonRoot.GetValue('nmPlayer').Value);
    Memo1.Lines.Add('dtCreate=> ' + jsonRoot.GetValue('dtCreate').Value);
    Memo1.Lines.Add('dtChange=> ' + jsonRoot.GetValue('dtChange').Value);
    Memo1.Lines.Add('idStatus=> ' + (jsonRoot.GetValue('idStatus') as TJSONBool).ToString);
  finally
    tokenAutenticacao.Free;
    tokenResponse.Free;
    tokenRequest.Free;
    tokenClient.Free;
  end;
end;

我使用的是Delphi XE 10 Seatle。感谢

修改

就副本而言,我并不认为此数据格式是ISO 8601.这就是为什么我无法通过Google找到答案的原因。也许我的问题会帮助其他一些像我一样也不了解的人。

1 个答案:

答案 0 :(得分:4)

我会从该字符串中提取日期的每一部分(年,月,日,小时,分钟,毫秒),并对日期时间值进行编码。这很简单,因为每个部分总是在同一个位置。

function JSONDate_To_Datetime(JSONDate: string): TDatetime;
var Year, Month, Day, Hour, Minute, Second, Millisecond: Word;
begin
  Year        := StrToInt(Copy(JSONDate, 1, 4));
  Month       := StrToInt(Copy(JSONDate, 6, 2));
  Day         := StrToInt(Copy(JSONDate, 9, 2));
  Hour        := StrToInt(Copy(JSONDate, 12, 2));
  Minute      := StrToInt(Copy(JSONDate, 15, 2));
  Second      := StrToInt(Copy(JSONDate, 18, 2));
  Millisecond := Round(StrToFloat(Copy(JSONDate, 19, 4)));

  Result := EncodeDateTime(Year, Month, Day, Hour, Minute, Second, Millisecond);
end;