web-dev-qa-db-fra.com

Comment convertir une chaîne en date en Delphi

Lorsque je convertis le type string en TDateTime j'obtiens une erreur. J'utilise la fonction VarToDateTime . Ma date sous forme de chaîne est 2018-07-11T13:45:14.363.

var
  s: string;
  v: Variant;
  dt: TDateTime;
begin
  s := '2018-07-11T13:45:14.363';
  v := s;
  dt := VarToDateTime(v);
end;

enter image description here

7
Abdumalik Nabiev

Le succès d'une conversion de string vers TDateTime à l'aide de VarToDateTime dépend des paramètres régionaux dans le système des utilisateurs. La conversion échoue si ces paramètres ne correspondent pas à la chaîne. C'est la raison pour laquelle la conversion échoue sur mon système, ainsi que sur le vôtre.


L'option principale , si vous travaillez avec Delphi XE6 ou version ultérieure, consiste à utiliser la fonction ISO8601ToDate() comme suggéré par Marc Guillot dans une autre réponse

Si vous travaillez avec Delphi 2010 ou une version ultérieure, vous pouvez utiliser la solution présentée ici.

Les versions antérieures à Delphi 2010 s'étouffent avec le "T" dans la chaîne d'entrée et peuvent réussir si le "T" est supprimé ou remplacé par un espace.


Utilisez une fonction de conversion qui accepte un TFormatSetting qui peut être ajusté en fonction de la chaîne à convertir. Une telle fonction est la surcharge suivante de StrToDateTime() (Voir document Embarcadero )

function StrToDateTime(const S: string; const AFormatSettings: TFormatSettings): TDateTime;

La définition de AFormatSettings pour faire correspondre la chaîne à convertir garantit la réussite de la conversion:

procedure TForm3.Button1Click(Sender: TObject);
var
  fs: TFormatSettings;
  s: string;
  dt: TDateTime;
begin
  fs := TFormatSettings.Create;
  fs.DateSeparator := '-';
  fs.ShortDateFormat := 'yyyy-MM-dd';
  fs.TimeSeparator := ':';
  fs.ShortTimeFormat := 'hh:mm';
  fs.LongTimeFormat := 'hh:mm:ss';

  s := '2018-07-11T13:45:14.363';
  dt := StrToDateTime(s, fs);
end;
12
Tom Brunberg

Il semble s'agir de chaînes de date/heure ISO8601: https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations

Ainsi, sur Delphi XE 6 et versions ultérieures, vous pouvez utiliser la fonction de conversion correspondante: ISO8601ToDate

http://docwiki.embarcadero.com/Libraries/XE8/en/System.DateUtils.ISO8601ToDate

Mais si vous utilisez une ancienne version de Delphi, vous pouvez utiliser la fonction XMLTimeToDateTime sur l'unité XSBuiltIns pour effectuer cette conversion (disponible depuis Delphi 6).

http://docwiki.embarcadero.com/Libraries/Tokyo/en/Soap.XSBuiltIns.XMLTimeToDateTime

5
Marc Guillot