11
votes

Convertir la chaîne en système.DateTime en f #

Si je reçois une chaîne de la ligne de commande et cela ressemble à ceci: xxx

Comment puis-je convertir cette chaîne à un objet DateTime dans F #?


2 commentaires

Dupliqué possible de F # - dates d'analyse


@Sebastian P - Similaire, mais je ne crois pas une duplication exacte, les deux questions demandent comment analyser les formats de date différents, ce qui conduit réellement à différentes réponses.


3 Réponses :


15
votes

Vous pouvez le faire aussi simplement que ceci:

let dateTime = System.DateTime.Parse "1-1-2011"


0 commentaires

14
votes

Pour ajouter une bonne chose à ce que 7Sharp9 a écrit, si vous souhaitez également gérer les échecs, vous pouvez écrire:

match System.DateTime.TryParse "1-1-2011" with
| true, date -> printfn "Success: %A" date
| false, _ -> printfn "Failed!"


1 commentaires

Je ne savais pas qu'il était possible de le faire avec l'argument de sortie, agréable



26
votes

Selon votre besoin spécifique, .Net's DateTime classe a plusieurs méthodes statiques pour convertir des chaînes vers datetime code>, celles-ci sont denttime.parse code>, denttime.parseexact code> et datetime.tryparse code> et leur Plusieurs surcharges.

@ 7Sharp9 a démontré le moyen le plus élémentaire d'effectuer une analyse de la date, avec un appel de méthode directe à DateTime.Parse Code>. Mais où les choses sont intéressantes dans F # est avec datetime.tryparse code>. Alors que DateTime.Parse CODE> lancera une exception si l'analyse échoue, la surcharge la plus simple de DateTime.tryparse code> a la signature String * BYREF -> BOOL Qui retournera si l'analyse réussit à définir l'argument byref code> à la date analysée si true, ou à sa valeur par défaut ( null code> dans ce cas) sinon. Cependant, la syntaxe d'utilisation de cela en F # est encombrante (et même ce n'est pas agréable de n'importe quelle langue .NET), la langue F # a donc été conçue avec une caractéristique spéciale qui permet une convention d'appel beaucoup plus agréable pour des méthodes telles que celles-ci comme @ Thomas Petricek pointu Out. P>

Mais même F # 'S (BOOL, résultat) Type de retour Modèle de retour ici n'est pas idéal. La plupart du temps, vous n'avez pas besoin de la valeur par défaut si une analyse échoue. Une signature plus agréable pour DateTime.tryparsee code> serait String -> Option code>. Heureusement, nous pouvons facilement étendre DateTime code> comme nous le souhaitons: p> xxx pré>

Nous utilisons l'extension ci-dessus comme: P>

> ["11/23/2003"; "not a date"; "1/1/23 23:23pm"] |> Seq.choose(|DateTime|_|);;
val it : seq<DateTime> =
  seq
    [11/23/2003 12:00:00 AM {Date = 11/23/2003 12:00:00 AM;
                             Day = 23;
                             DayOfWeek = Sunday;
                             DayOfYear = 327;
                             Hour = 0;
                             Kind = Unspecified;
                             Millisecond = 0;
                             Minute = 0;
                             Month = 11;
                             Second = 0;
                             Ticks = 632051424000000000L;
                             TimeOfDay = 00:00:00;
                             Year = 2003;};
     1/1/2023 11:23:00 PM {Date = 1/1/2023 12:00:00 AM;
                           Day = 1;
                           DayOfWeek = Sunday;
                           DayOfYear = 1;
                           Hour = 23;
                           Kind = Unspecified;
                           Millisecond = 0;
                           Minute = 23;
                           Month = 1;
                           Second = 0;
                           Ticks = 638082121800000000L;
                           TimeOfDay = 23:23:00;
                           Year = 2023;}]


0 commentaires