10
votes

DateTime String Analysing

J'ai fait un analyseur générique pour analyser les fichiers ASCII. Lorsque je veux analyser des dates, j'utilise la fonction parseexact dans l'objet DateTime à l'analyse, mais j'ai des problèmes avec l'année.

Le texte à analyser est i.e. "090812" avec la chaîne de parseexact "YYMMDD".

J'espère obtenir un objet DateTime disant "12/8-2009", mais je reçois "12 / 8-1909". Je sais que je pourrais faire une solution laideuse en l'analysant par la suite, et modifier ainsi l'année ..

Quelqu'un peut savoir d'une manière intelligente de résoudre ce problème ??

Merci d'avance ..

søren


2 commentaires

Les documents et autres postes suggèrent que cela devrait fonctionner pour la date à laquelle vous disposez (par exemple 2009 pour 09). Pouvez-vous poster l'appel de parseexact exact que vous faites?


Plus d'infos Ici: US / Bibliothèque / ...


3 Réponses :


2
votes

Vous devrez déterminer une sorte de date de seuil adaptée à vos données. Si la date analysée est avant cette date, ajoutez 100 ans. Un moyen sûr de faire cela est de préfixer la chaîne d'entrée avec le siècle approprié. Dans cet exemple, j'ai choisi 1970 en tant que coupure: xxx

jon skeet a également posté un bon exemple en utilisant denttitimeformatinfo que j'avais momentanément oublié :)


0 commentaires

2
votes

Eh bien, si vous êtes certain que toutes vos dates de source sont ceci siècle, vous pouvez utiliser Parseexact contre une chaîne source "20" -Préfixée.


0 commentaires

18
votes

façon théoriquement élégante de faire cela: Changer le Twodigityearmax Propriété du calendrier utilisé par le DateTimeFormatinfo Vous utilisez pour analyser le texte . Par exemple: xxx

puis utilisez dtfi dans votre appel sur denttime.parseexact .

mode pratique de faire Ceci: ajoutez "20" au début de votre entrée et analysez avec "yyyymmdd".


5 commentaires

J'aime un peu comme votre solution théorique. Le DateTimeFormatinfo n'est qu'une installation unique de toute façon. Cela permet également de couper différentes coupures plutôt que de simplement supposer que tout est au cours de ce siècle.


C'est bien .. pas tout à fait sûr, qu'est-ce que vous essayez de faire ..!? Mais de toute façon, dtfi.calendar.twodigityearmax ne peut être réglé à un nombre supérieur à 99 .. :-( .. et je ne suis pas heureux de la solution avec juste ajouter "20" en face, car je ne peux pas garantir ce ne peut pas aboutir utilisé pour regarder des données plus anciennes


@Mullerdk: Désolé, il devrait être défini sur 2000 ... ou peut-être 1910 si vous voulez 100812 1910, etc.


(Édité le code pour 1910.) Quelle est la première année que vous verrez? À un moment donné, vous vous retrouverez avec un format ambiguë ... Vous ne pouvez pas représenter une gamme de plus de 100 ans avec seulement deux chiffres décimaux. Notez que si vous le définissez à 1910, l'année prochaine, vous devrez la définir à 1911, etc. Vous voudrez peut-être utiliser datetime.now.year - 100 .


FYI DateTimeFormatinfo.clone () appelle cela.Calendar.clone ()