J'essaie de comparer un horodatage d'une demande entrante à une valeur stockée de base de données. SQL Server conserve bien sûr une certaine précision de millisecondes sur l'heure, et lorsqu'il est lu dans un .NET DateTime, il inclut ces millisecondes. La demande entrante au système, cependant, n'offre pas cette précision, donc je dois simplement laisser tomber les millisecondes.
J'ai l'impression de manquer quelque chose d'évident, mais je n'ai pas trouvé de façon élégante de le faire (C #).
string
représentation formatée de aDateTime
, une modification est peut-être nécessaire pour indiquer clairement que "tronquer" / millisecondes « baisse » signifie « produire uneDateTime
valeur où toutes les composantes de date / heure sont les mêmes , saufTimeOfDay.TotalMilliseconds
est0
. » Les gens ne lisent pas, bien sûr, mais juste pour éliminer toute ambiguïté.Réponses:
Ce qui suit fonctionnera pour un DateTime qui a des millisecondes fractionnaires et conserve également la propriété Kind (Local, Utc ou Undefined).
ou l'équivalent et plus court:
Cela pourrait être généralisé dans une méthode d'extension:
qui est utilisé comme suit:
la source
la source
Voici une méthode d'extension basée sur une réponse précédente qui vous permettra de tronquer à n'importe quelle résolution ...
Usage:
Classe:
la source
la source
Millisecond
propriété donne un entier compris entre 0 et 999 (inclus). Donc, si l'heure de la journée avant l'opération était, disons,23:48:49.1234567
alors cet entier sera123
, et l'heure de la journée après l'opération23:48:49.0004567
. Il n'a donc pas été tronqué à un nombre entier de secondes.Parfois, vous souhaitez tronquer quelque chose en fonction du calendrier, comme l'année ou le mois. Voici une méthode d'extension qui vous permet de choisir n'importe quelle résolution.
la source
Au lieu de laisser tomber les millisecondes puis de comparer, pourquoi ne pas comparer la différence?
ou
la source
Moins évident mais plus de 2 fois plus rapide:
la source
d.AddMilliseconds(-d.Millisecond)
,, ne déplace pas nécessairement le DateTime exactement à la seconde complète précédente.d.Ticks % TimeSpan.TicksPerMillisecond
les tiques (entre 0 et 9 999) au-delà de votre seconde resteront.Pour arrondir à la seconde:
Remplacez par
TicksPerMinute
pour arrondir à la minute près.Si votre code est sensible aux performances, soyez prudent
Mon application passait 12% du temps CPU dans System.DateTime.GetDatePart .
la source
Un moyen de lecture facile est ...
Et plus...
la source
var now = DateTime.Parse(DateTime.Now.ToString())
fonctionne très bien.Concernant la réponse de Diadistis. Cela a fonctionné pour moi, sauf que j'ai dû utiliser Floor pour supprimer la partie fractionnaire de la division avant la multiplication. Alors,
devient
Je m'attendais à ce que la division de deux valeurs Long aboutisse à un Long, supprimant ainsi la partie décimale, mais elle la résout comme un Double, laissant la même valeur exacte après la multiplication.
Eppsy
la source
2 Méthodes d'extension pour les solutions mentionnées ci-dessus
usage:
la source
Pas la solution la plus rapide mais simple et facile à comprendre:
la source
Et par l'utilisation de
: P
la source
string
au lieu d'unDateTime
, mais cela omet complètement les composants temporels de la sortie . (Cela rend également l'accès à laToday
propriété inutile.)Nouvelle méthode
// définir le paramètre de passe de chaîne jj-mmm-aaaa return 24-feb-2016
Ou affiché sur la zone de texte
// mettre sur PageonLoad
la source
string
au lieu d'unDateTime
, mais cela omet complètement les composants temporels de la sortie . (Cela rend également l'accès à laToday
propriété inutile.)Dans mon cas, je visais à sauver TimeSpan de l'outil datetimePicker sans enregistrer les secondes et les millisecondes, et voici la solution.
Convertissez d'abord le datetimePicker.value au format de votre choix, le mien est "HH: mm", puis reconvertissez-le en TimeSpan.
la source
string
) de le faire seraitDateTime datetime = datetimepicker1.Value; TimeSpan timeSpan = new TimeSpan(datetime.Hour, datetime.Minute, 0);
Ou vous pouvez utiliser une variante de la méthode d'extension de Joe qui fonctionne sur desTimeSpan
valeurs et utiliseTimeSpan timeSpan = datetime.TimeOfDay.Truncate(TimeSpan.FromSeconds(1));
pour tronquer les secondes.Ceci est ma version des méthodes d'extension publiées ici et dans des questions similaires. Cela valide la valeur des graduations d'une manière facile à lire et préserve le DateTimeKind de l'instance DateTime d'origine. (Cela a des effets secondaires subtils mais pertinents lors du stockage dans une base de données comme MongoDB.)
Si le véritable objectif est de tronquer un DateTime à une valeur spécifiée (c'est-à-dire Heures / Minutes / Secondes / MS), je recommande plutôt d'implémenter cette méthode d'extension dans votre code. Il garantit que vous ne pouvez tronquer qu'avec une précision valide et il conserve les métadonnées DateTimeKind importantes de votre instance d'origine:
Ensuite, vous pouvez utiliser la méthode comme ceci:
la source
Je sais que la réponse est assez tardive, mais la meilleure façon de se débarrasser des millisecondes est
Essayez d'imprimer la valeur de la variable, elle affichera la date et l'heure, sans millisecondes.
la source