38 votes

.NET Date sans heure - existe-t-il ou n'en ai-je pas besoin ?

Je fais un peu de modélisation de domaine et je tombe sur une propriété qui, à mon avis, serait mieux exposée comme une Date plutôt qu'une DateTime, sans composante temporelle.

Y a-t-il une bonne raison pour laquelle un tel type n'existe pas dans le Framework ? L'idée d'ajouter un type Date à SQL Server a été jugée suffisamment bonne. De plus, si quelqu'un connaît une implémentation pratique de la classe Date, faites-le moi savoir !

Modification 2018 : j'aborde maintenant cette question en utilisant un type d'objet de valeur :

public class Date : ValueOf<DateTime, Date>  //Install-Package ValueOf
{ 
    protected override void Validate() 
    { 
        if (Value.Date != Value) throw new ArgumentException(); 
    } 
}

...

var date = Date.From(someDateTime);

0 votes

L'un d'entre eux arrive dans .NET 6. Voir stackoverflow.com/questions/5314309/

47voto

Jon Skeet Points 692016

Non, il n'y en a pas, et oui, il devrait y en avoir un.

Je ne crois pas qu'il y ait une autre bonne raison que celle-là. L'API de date et d'heure dans .NET n'est pas très bonne. selon mon point de vue (très partial).

Je travaille sur une nouvelle API appelée Heure de Noda qui bien sûr fait ont une classe à date unique dans ( LocalDate ) mais il n'est pas encore prêt pour la production. Il se peut qu'il fasse déjà tout ce dont vous avez besoin, bien sûr, et si c'est le cas, il ne sera pas prêt pour la production. presque car vous pouvez toujours demander que les fonctionnalités dont vous avez besoin soient implémentées le plus tôt possible...

0 votes

Il ne nous reste plus qu'à convaincre MS de déprécier les anciennes classes :)

0 votes

@mcintyre321 : Eh bien, j'aimerais beaucoup parler à quelqu'un de l'équipe BCL d'une nouvelle API pour .NET 6 :) (Je pense qu'il est bien trop tard pour .NET 5...)

1 votes

S'il vous plaît, faites-le. Je me souviens du jour redouté où l'heure d'été a changé et où toutes les réunions récurrentes de nos utilisateurs ont été décalées d'une heure.

8voto

Guffa Points 308133

Dans une base de données, la capacité de stockage est plus importante. date qui utilise moins d'espace qu'un datetime peut avoir un sens. Dans une application, vous avez rarement besoin de sauvegarder ces quelques octets.

Vous pourriez assez facilement faire un Date qui convertit en et à partir de DateTime mais ne stocke les jours qu'en interne. Quelque chose comme :

public struct Date {

  private int _days;

  private Date(int days) { _days = days; }

  public static implicit operator DateTime(Date date) {
    return DateTime.MinValue.AddDays(date._days);
  }

  public static implicit operator Date(DateTime dateTime) {
    return new Date((int)(dateTime - DateTime.MinValue).TotalDays);
  }

}

8voto

Clay Points 1060

J'ai créé un simple Structure de la date pour les moments où vous avez besoin d'une simple date sans vous soucier de la portion d'heure, des fuseaux horaires, de l'heure locale et de l'heure exacte, etc.

https://github.com/claycephas/csharp-date

0 votes

Bien qu'elle soit agréable, cette solution utilise néanmoins Datetime en interne. J'espérais pouvoir épargner quelques bits dans un grand ensemble, en utilisant uniquement Date, mais cette solution ne le fait pas.

-2voto

JasonG Points 11

Oui, il y en a un. Date , DateTime (VB) et DateTime (C#) ont tous deux une fonction appelée Date qui ne renvoient que la partie date de la date/heure.

Il existe également un Time de sorte que vous pouvez les utiliser pour les deux et renvoyer les parties date/heure séparément.

0 votes

C'est vrai et je ne sais pas pourquoi la réponse sélectionnée (très bien classée) dit que ce n'est pas possible. Propriété DateTime.Date

2 votes

Parce que DateTime.Date est sujet à des erreurs. Vous l'oublierez un jour ou l'autre !

8 votes

DateTime.Date renvoie un objet DateTime. Le PO a demandé un objet Date, et non une propriété Date d'un objet existant. DateTime.Date renvoie réellement un objet DateTime avec une composante temporelle nulle. Mais cela signifie que les applications ne peuvent pas faire la différence entre "minuit ce jour" et "ce jour sans aucune heure spécifiée" ... ce qui signifie qu'elles ne savent pas si elles doivent afficher la partie temps ou non, etc. Il y a également des problèmes de conversion de "DateTime.Date" entre les fuseaux horaires, où vous ne voudriez pas qu'elle change, mais où elle pourrait afficher 11 heures la veille, si vous affichez sur un ordinateur dans un autre fuseau horaire.

-4voto

Justin Points 42106

Il n'est pas vraiment nécessaire d'en avoir un - il suffit d'utiliser une date dont la composante temporelle est mise à zéro (c'est-à-dire à minuit le jour précédent), ou d'ignorer complètement la composante temporelle.

Par exemple, vous pouvez utiliser DateTime.Today pour obtenir la date d'aujourd'hui (par opposition à DateTime.Now )

25 votes

Dans ce cas, il n'y a pas besoin non plus de types entiers - nous pouvons simplement utiliser des types à virgule flottante et ignorer tout ce qui se trouve après la virgule, n'est-ce pas ? De même, il n'est pas nécessaire d'avoir un type de chaîne de caractères - il suffit d'utiliser un tableau d'octets et de le décoder quand on en a besoin. Date est conceptuellement un type différent de DateTime - il est logique d'ajouter des minutes à une DateTime mais pas à un Date . Il est logique de penser à un DateTime dans un fuseau horaire particulier, mais pas un Date . Je pourrais continuer :) Il est extrêmement important de pouvoir laisser votre code exprimer les concepts qu'il traite. DateTime ne le fait pas.

0 votes

@Jon Vous ne devriez pas utiliser des flottants au lieu d'entiers car les erreurs d'arrondi s'additionnent (1,1 * 10 = 11, par opposition à 1 * 10 = 10), vous ne devriez pas utiliser des tableaux d'octets pour les chaînes de caractères car il n'y a pas de réelle considération pour l'unicode. Idéalement il y aurait un Date mais ce n'est pas la fin du monde s'il n'y en a pas.

9 votes

Ajoutez beaucoup de minutes à un DateTime et vous obtiendrez également une autre date - une autre sorte d'erreur d'arrondi. Bien sûr, vous ne devez effectuer des opérations arithmétiques qu'avec ces valeurs entières... dommage, vous ne pouvez pas savoir ce qui est censé être un entier et ce qui ne l'est pas si vous n'avez que des flottants. Avez-vous beaucoup travaillé avec des dates et des heures en .NET ? Le code est difficile à lire et à comprendre car DateTime est utilisé pour tout - heures locales, UTC, dates, heures, etc. DateTimeOffset aide, mais pas suffisamment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X