Je veux obtenir le premier et le dernier jour du mois où se trouve une date donnée. La date provient d'une valeur dans un champ d'interface utilisateur.
Si j'utilise un sélecteur de temps, je pourrais dire
var maxDay = dtpAttendance.MaxDate.Day;
Mais j'essaye de l'obtenir à partir d'un objet DateTime. Donc si j'ai ça ...
DateTime dt = DateTime.today;
Comment obtenir le premier et le dernier jour du mois dt
?
_Date
variable. Quel "minimum et maximum" essayez-vous d'obtenir de cette valeur?Réponses:
DateTime
la structure stocke une seule valeur, pas une plage de valeurs.MinValue
etMaxValue
sont des champs statiques, qui contiennent une plage de valeurs possibles pour les instances deDateTime
structure. Ces champs sont statiques et ne se rapportent pas à une instance particulière deDateTime
. Ils concernent leDateTime
type lui-même.Lecture suggérée: statique (référence C #)
MISE À JOUR: Obtenir la plage de mois:
la source
lastDayofMonth
êtrefirstDayOfMonth.AddMonths(1).AddSeconds(-1);
?AddTicks(-1)
, mais si nous ne nous soucions pas de la partie temps et ne pensons qu'à la partie date, alors les jours fonctionnent bien< firstDayOfNextMonth
au lieu de<= lastDayOfMonth
. De cette façon, cela fonctionnera toujours quelle que soit la granularité. (Je suis sûr que les tiques iront bien, mais qui sait ce que l'avenir nous réserve ... nanoticks?)Il s'agit plutôt d'un long commentaire sur les réponses de @Sergey et @ Steffen. Ayant écrit moi-même un code similaire dans le passé, j'ai décidé de vérifier ce qui était le plus performant tout en se rappelant que la clarté est également importante.
Résultat
Voici un exemple de résultat de test pour 10 millions d'itérations:
Code
J'ai utilisé LINQPad 4 (en mode programme C #) pour exécuter les tests avec l'optimisation du compilateur activée. Voici le code testé pris en compte comme méthodes d'extension pour plus de clarté et de commodité:
Une analyse
J'ai été surpris par certains de ces résultats.
Bien qu'il n'y ait pas grand-chose, il
FirstDayOfMonth_AddMethod
était légèrement plus rapide queFirstDayOfMonth_NewMethod
dans la plupart des tests. Cependant, je pense que ce dernier a une intention légèrement plus claire et j'ai donc une préférence pour cela.LastDayOfMonth_AddMethod
était un perdant clair contreLastDayOfMonth_AddMethodWithDaysInMonth
,LastDayOfMonth_NewMethod
etLastDayOfMonth_NewMethodWithReuseOfExtMethod
. Entre les trois plus rapides, il n'y a pas grand-chose et cela dépend donc de vos préférences personnelles. Je choisis la clarté deLastDayOfMonth_NewMethodWithReuseOfExtMethod
sa réutilisation d'une autre méthode d'extension utile. À mon humble avis, son intention est plus claire et je suis prêt à accepter le faible coût de performance.LastDayOfMonth_SpecialCase
suppose que vous fournissez le premier du mois dans le cas particulier où vous avez peut-être déjà calculé cette date et utilise la méthode add avecDateTime.DaysInMonth
pour obtenir le résultat. C'est plus rapide que les autres versions, comme vous vous en doutez, mais à moins que vous n'ayez désespérément besoin de vitesse, je ne vois pas l'intérêt d'avoir ce cas spécial dans votre arsenal.Conclusion
Voici une classe de méthode d'extension avec mes choix et en accord général avec @Steffen je crois:
Si vous êtes arrivé jusqu'ici, merci pour le temps! C'est amusant: ¬). Veuillez commenter si vous avez d'autres suggestions pour ces algorithmes.
la source
LastDayOfMonth_AddMethod_SpecialCase
(ou quelque chose comme ça). En attendant le premier jour du mois comme paramètre, je pense que le plus rapide devrait être ce quiLastDayOfMonth_AddMethod
fait! Donc, ce serait aussi simple que:return value.AddMonths(1).AddDays(-1);
Obtenir la plage de mois avec l'API .Net (juste une autre façon):
la source
"
Last day of month
" est en fait "First day of *next* month, minus 1
". Voici donc ce que j'utilise, pas besoin de méthode "DaysInMonth":REMARQUE: L'utilisation de I raison
AddMinutes(-1)
, pasAddDays(-1)
ici parce que généralement vous avez besoin de ces fonctions de date pour des rapports pour une date, et lorsque vous construisez un rapport pour une période, la « date de fin » devrait effectivement être quelque chose commeOct 31 2015 23:59:59
si votre rapport fonctionne correctement - y compris toutes les données du dernier jour du mois.C'est-à-dire que vous obtenez le "dernier moment du mois" ici. Pas le dernier jour.
OK, je vais me taire maintenant.
la source
la source
description
qui aide à expliquer votre code. MerciIci, vous pouvez ajouter un mois pour le premier jour du mois en cours, puis supprimer 1 jour de ce jour.
la source
Si vous ne vous souciez que de la date
Si vous voulez gagner du temps
la source
La réponse acceptée ici ne prend pas en compte le type de l'instance DateTime. Par exemple, si votre instance DateTime d'origine était de type UTC, en créant une nouvelle instance de DateTime, vous créerez une instance de type inconnu qui sera ensuite traitée comme heure locale en fonction des paramètres du serveur. Par conséquent, la meilleure façon d'obtenir la première et la dernière date du mois serait la suivante:
De cette façon, le type d'origine de l'instance DateTime est conservé.
la source
Essaye celui-là:
la source
J'ai utilisé cela dans mon script (fonctionne pour moi) mais j'avais besoin d'une date complète sans avoir besoin de la couper à la date et à l'heure.
la source
Essayez ceci. Il calcule essentiellement le nombre de jours écoulés
DateTime.Now
, puis en soustrait un et utilise la nouvelle valeur pour trouver le premier du mois en cours. De là, il utilise celaDateTime
et utilise.AddMonths(-1)
pour obtenir le premier du mois précédent.Obtenir le dernier jour du mois dernier fait essentiellement la même chose, sauf qu'il ajoute un à un nombre de jours dans le mois et soustrait cette valeur
DateTime.Now.AddDays
, vous donnant le dernier jour du mois précédent.la source
Pour la culture perse
la source
Tu peux le faire
la source
moyen facile de le faire
la source
la source