0
votes

Meilleure façon de gérer différents formats DateTime en C #

Je prends des données à partir d'une feuille Excel, et les valeurs DateTime Code> varient selon les permutations suivantes: xxx pré>

pour d'autres scénarios où ils échangent jour et mois , Je voudrais juste attraper une exception à ce sujet. P>

J'ai essayé plusieurs méthodes, telles que des variations parseexact, mais je reçois toujours des problèmes avec l'une ou l'autre. P>

y a-t-il un générique solution capable de gérer les situations ci-dessus? p>

J'utilise actuellement les éléments suivants: P>

public DateTime ParseDateAndTime(string dateValue, int? timeValue)
{
    var combinedDate = $"{dateValue} {(timeValue ?? 0) / 100}:{(timeValue ?? 0) % 100}";

    return DateTime.ParseExact(combinedDate, "d/M/yyyy H:m", CultureInfo.InvariantCulture);
}


1 commentaires

Avez-vous les valeurs de date et d'heure comme un tout ou comme deux valeurs distinctes?


4 Réponses :


0
votes

Je suppose que vous ne connaissez pas le format spécifique de chaque valeur DateTime lorsque vous le lisez à partir d'Excel, correct? Comment obtenez-vous les données? Par exemple, si vous ouvrez directement le fichier Excel en utilisant Interop ou quelque chose d'autre, vous pouvez essayer de lire le CellFormat de la cellule spécifique. Bien sûr, cela exige que le format du DateTime soit correctement défini dans la feuille Excel File / Excel.

ou obtenez-vous les valeurs de date comme une liste bronde sans la référence à la feuille Excel / Excel? Ensuite, vous pouvez essayer d'utiliser trypseexact à l'aide de différents formats de date et de voir quels matchs comme trypseeexact renvoie un booléen en conséquence. Peu de temps peut être une date comme le 12/12/2020 - Le 12 est valide pour le mois et pour la journée. Par conséquent, il est nécessaire d'obtenir le format d'une manière ou d'une autre.


2 commentaires

Nous avons un format spécifié, qui est (jj / mm / aaayy hhmm). Mais les utilisateurs peuvent toucher un chiffre à un seul chiffre de jour / mois, et je voudrais le gérer ...


Je vois - ma faute. J'ai pensé ou compris que DD et MM peuvent se mélanger dans leur position. Par exemple: jj / mm / aaaa - mm / jj / aaaa. Devrait-il mieux lire la prochaine fois.



0
votes

Si vous essayez d'obtenir une date d'Excel, et que les données sont stockées comme date dans Excel, essayez de l'obtenir comme objet DateTime à l'aide de Plage.Value code>.

si fort> datetime.parseexact () code> fonctionne, veuillez simplement l'utiliser. strong> p>

s'il est stocké en tant que String et le DateTime.Parseexact () code> ne fonctionne pas, cependant, je vous conseillerai d'écrire une fonction vous-même pour analyser la chaîne. P>

Par exemple: P>

 public static DateTime getDate(string date)
        {

            string[] splitedDate = date.Split('/');

            int day;
            if (int.TryParse(splitedDate[0], out day)) ;
            else
            {
                throw new ArgumentException();
            }
            int month;
            if (int.TryParse(splitedDate[1], out month)) ;
            else
            {
                throw new ArgumentException();
            }
            int year;
            if (int.TryParse(splitedDate[2], out year)) ;
            else
            {
                throw new ArgumentException();
            }

            return new DateTime(year, month, day);
        }


0 commentaires

1
votes

Ça fonctionne:

public DateTime ParseDateAndTime(string dateValue)
{
    return DateTime.ParseExact(dateValue, "d/M/yyyy HHmm", CultureInfo.InvariantCulture);
}


0 commentaires

1
votes

Vous pouvez voir que vous avez une date comme chaîne, mais votre valeur de temps pourrait être null. Par conséquent, je suggérerais une séparation de vous analyser en 2 étapes date et heure. L'autre chose est que je le retournerais comme un objet DateTime, je peux donc l'utiliser comme je le souhaite à condition d'utiliser parseexact. De cette façon si votre temps est NULL ou si vous avez un problème, vous aurez toujours votre datère.

Vous pouvez également bien sûr, si la date n'est pas analysée, ajout d'une condition et retourner une date par défaut à Stead, Thorw Exception ou autre chose.

juste un exemple de base, une chose comme celle-ci: p> xxx pré>

Si vous auriez besoin de lancer une exception, vous faites quelque chose comme: P>

public class MyDateTimeObject
{
    public DateTime ParsedDatetime { get; set; }
    public bool ParsingIssue { get; set; }
}


6 commentaires

Si l'entrée est E.G. 3/13/2020 , est-il possible de signaler comme format incorrect? Comme le format d'insérer sur CRM est dd / mm / yyyy`, je rencontrerais une exception au format.


Vérifiez la dernière mise à jour, au lieu d'exception, vous pouvez faire quelque chose d'autre. Vous pouvez présenter votre modèle de données comprenant un objet DateTime analysé et éventuellement les erreurs, si vous avez besoin d'exemple, je peux améliorer mon exemple


Puis-je savoir si le DateTime.trypsarse ("3/13/2020", OUT VAR DATEDPARSED) ci-dessus sera toujours vrai ?


Lorsque cette méthode ne peut pas analyser, une variable isdateparsed sera fausse


@gymcode à quoi ça ressemble, pouvez-vous utiliser la solution?


Merci, votre méthode a fonctionné, mais j'ai des problèmes de validation car il accepte toujours mm / jj / aaaa . J'ai utilisé la méthode d'Alex dans l'intervalle.