La conversion d'une chaîne de TDateTime basé sur l'arbitraire d'un format
Est-il de toute façon dans Delphi 5 pour convertir une chaîne en un TDateTime où vous pouvez spécifier le format à utiliser?
Je suis en train de travailler sur un jobprocessor, qui accepte des tâches à partir de différents postes de travail. Les tâches ont une gamme de paramètres, dont certains sont des dates, mais (malheureusement, et en dehors de mon contrôle), ils sont passés comme des chaînes de caractères. Depuis les travaux peuvent venir de différents postes de travail, le format datetime utilisé pour formater les dates en tant que chaîne pourrait (et, bien sûr, réelle ne) diffèrent.
Googler autour, la seule solution rapide, j'ai trouvé était à sournoisement changer le ShortDateFormat
variable, et de le restaurer à sa valeur d'origine par la suite. Depuis ShortDateFormat
est une variable globale, et je travaille dans une tige filetée de l'environnement, le seul moyen serait de travailler est par la synchronisation de tous les accès, ce qui est totalement inacceptable (et annulables).
J'ai pu copier le code de la bibliothèque de la SysUtils
unité dans mes propres méthodes, et de les adapter à travailler avec un format spécifié à la place des variables globales, mais je me demandais simplement si il y a quelque chose de plus adéquat là que j'ai manqué.
Cordialement, et merci d'avance,
Willem
Mise à JOUR
Pour le dire plus brièvement:
J'ai besoin de quelque chose comme StrToDate
(ou StrToDateTime
), avec l'ajout de l'option de spécifier le format exact il devrait utiliser pour convertir la chaîne de caractères à un TDateTime.
- double possible de la fonction Inverse de FormatDateTime
Vous devez vous connecter pour publier un commentaire.
J'ai créé une telle routine pour FreePascal est dateutils unité, et il devrait facile de port, si le transfert est nécessaire à tous.
Code:
http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/packages/rtl-objpas/src/inc/dateutil.inc?revision=30628&view=co
(le code est le dernier (énorme) de la procédure à la fin du fichier)
documentation:
http://www.freepascal.org/docs-html/rtl/dateutils/scandatetime.html
Remarque qu'elle n'est pas complète inverse de formatdatetime, et il a quelques extensions:
L'inverse de FormatDateTime n'est pas à 100% un inverse, tout simplement parce que l'on peut mettre par exemple le temps des jetons de deux fois dans la chaîne de format,et scandatetime ne sais pas laquelle choisir.
Des chaînes de caractères comme hn ne peut pas être inversée en toute sécurité. E. g. 1:2 (2 minutes après 1) livre 12, qui est analysée comme 12:00 et puis
manque caractères pour le "n" de la partie.
Extensions
(Je crois que ces commentaires sont légèrement dépassées dans le sens de chapeau de certains pays d'Asie ont été ajoutées plus tard, mais je ne suis pas sûr)
Utilisation VarToDateTime à la place. Il supporte beaucoup plus de formats de date dans la chaîne et les convertit automatiquement.
Je vois que vous êtes à l'aide de Delphi 5. Certaines versions de Delphi aurez besoin d'ajouter des Variantes à la clause uses; la plupart des versions ultérieures de l'ajouter pour vous. Je ne me souviens pas à quelle catégorie de Delphi 5 est tombé dans.
VarToDateTime
fonctionne pour la plupart de la région, mais il échoue pour des pays comme l'Indonésie à l'aide de la virgule (,
) comme DecimalSeparator et point (.
) comme ThousandSeparatorPlus tard, des versions de Delphi peut prendre un supplément de TFormatSettings argument de la chaîne de fonctions de conversion. TFormatSettings est une structure contenant les différents formats des variables globales (ShortDateFormat, LongDateFormat, etc). De sorte que vous pouvez surcharger cette valeur dans un thread de sécurité et de même pour un seul appel.
Je ne me souviens pas en quelle version de Delphi cela a été introduit, mais je suis sûr que c'était après Delphi 5.
Donc oui, autant que je sache, vous avez besoin soit de synchroniser tous les accès à ShortDateFormat, ou utiliser une autre fonction.
Voici la fonction, et de ses deux assistants, j'ai écrit à analyser une chaîne de caractères à l'aide d'un exacte format datetime. Et depuis Stackoverflow est aussi un code wiki: voici tous le code:
Si vous voulez savoir comment cela a été résolu dans les plus tard, Delphi, vous pouvez prendre un coup d'oeil à la source d'un peu plus moderne (qui ressemble à Delphi 6) sysutils.pas ici:
http://anygen.googlecome.com/.../SysUtils.pas
Découvrez les versions surchargées de
StrToDateTime
que prendre unTFormatSettings
paramètre.Je ne suis pas sûr de ce que vous voulez. Je n'utilise pas de Delphi 5 plus mais je suis assez sûr que la fonction StrToDateTime existe en elle. Il vous permet de convertir une chaîne de TDateTime avec les paramètres de format. Ensuite, vous pouvez convertir ces TDateTime en n'importe quel format à l'aide de FormatDateTime qui vous permet d'utiliser tout format de date que vous souhaitez.
Utilisation RegExpr bibliothèque (https://github.com/masterandrey/TRegExpr)
Je voudrais aller dans l'autre sens autour d'elle. Comme je le vois, vous avez environ deux options dont vous l'avez mentionné vous-même
TDateTime
.Je me demande bien comment vous allez déterminer le format de dire 04/05/2010.