Comment est-ce que je représente une valeur de temps seulement dans .NET?

Existe-t-il un moyen de représenter une valeur temporelle uniquement dans .NET sans la date? Par exemple, en indiquant l’heure d’ouverture d’un magasin?

TimeSpan indique une plage, alors que je veux seulement stocker une valeur de temps. Utiliser DateTime pour indiquer cela entraînerait un nouveau DateTime(1,1,1,8,30,0) qui n’est pas vraiment souhaitable.

Comme d’autres l’ont dit, vous pouvez utiliser un DateTime et ignorer la date, ou utiliser un TimeSpan . Personnellement, je ne suis pas intéressé par l’une ou l’autre de ces solutions, car aucun des deux types ne reflète vraiment le concept que vous essayez de représenter. Je considère que les types date / heure de .NET sont plutôt clairsemés. Noda Time . Dans Noda Time, vous pouvez utiliser le type LocalTime pour représenter une heure du jour.

Une chose à considérer: l’heure de la journée n’est pas nécessairement la durée depuis minuit le même jour …

(Autre sharepoint vue, si vous souhaitez également représenter une heure de fermeture d’un magasin, vous pouvez trouver que vous souhaitez représenter 24h00, c’est-à-dire l’heure à la fin de la journée. La plupart des API de date / heure, y compris Noda) Heure – ne permettez pas que cela soit représenté comme une valeur d’heure du jour.)

Vous pouvez utiliser le temps

 TimeSpan timeSpan = new TimeSpan(2, 14, 18); Console.WriteLine(timeSpan.ToSsortingng()); // Displays "02:14:18". 

[Modifier]
Compte tenu des autres réponses et de l’édition de la question, j’utiliserais toujours TimeSpan. Inutile de créer une nouvelle structure où une structure existante du framework suffit.
Sur ces lignes, vous finirez par dupliquer de nombreux types de données natifs.

Si cette Date vide vous gêne vraiment, vous pouvez également créer une structure de Time plus simple:

 // more work is required to make this even close to production ready class Time { // TODO: don't forget to add validation public int Hours { get; set; } public int Minutes { get; set; } public int Seconds { get; set; } public override ssortingng ToSsortingng() { return Ssortingng.Format( "{0:00}:{1:00}:{2:00}", this.Hours, this.Minutes, this.Seconds); } } 

Ou, pourquoi s’embêter: si vous n’avez pas besoin de faire de calcul avec cette information, stockez-la simplement en tant que Ssortingng .

Je dis utiliser un DateTime. Si vous n’avez pas besoin de la partie date, ignorez-la simplement. Si vous avez besoin d’afficher juste l’heure à l’utilisateur, sortez-le formaté pour l’utilisateur comme ceci:

 DateTime.Now.ToSsortingng("t"); // outputs 10:00 PM 

Il semble que tout le travail supplémentaire consistant à créer une nouvelle classe ou même à utiliser un TimeSpan soit inutile.

Je pense que la classe de Rubens est une bonne idée, alors pensons à faire un échantillon immuable de sa classe Time avec une validation de base.

 class Time { public int Hours { get; private set; } public int Minutes { get; private set; } public int Seconds { get; private set; } public Time(uint h, uint m, uint s) { if(h > 23 || m > 59 || s > 59) { throw new ArgumentException("Invalid time specified"); } Hours = (int)h; Minutes = (int)m; Seconds = (int)s; } public Time(DateTime dt) { Hours = dt.Hour; Minutes = dt.Minute; Seconds = dt.Second; } public override ssortingng ToSsortingng() { return Ssortingng.Format( "{0:00}:{1:00}:{2:00}", this.Hours, this.Minutes, this.Seconds); } } 

En plus de Chibueze Opata :

 class Time { public int Hours { get; private set; } public int Minutes { get; private set; } public int Seconds { get; private set; } public Time(uint h, uint m, uint s) { if(h > 23 || m > 59 || s > 59) { throw new ArgumentException("Invalid time specified"); } Hours = (int)h; Minutes = (int)m; Seconds = (int)s; } public Time(DateTime dt) { Hours = dt.Hour; Minutes = dt.Minute; Seconds = dt.Second; } public override ssortingng ToSsortingng() { return Ssortingng.Format( "{0:00}:{1:00}:{2:00}", this.Hours, this.Minutes, this.Seconds); } public void AddHours(uint h) { this.Hours += (int)h; } public void AddMinutes(uint m) { this.Minutes += (int)m; while(this.Minutes > 59) this.Minutes -= 60; this.AddHours(1); } public void AddSeconds(uint s) { this.Seconds += (int)s; while(this.Seconds > 59) this.Seconds -= 60; this.AddMinutes(1); } } 

Si vous ne voulez pas utiliser un DateTime ou un TimeSpan, et que vous voulez simplement enregistrer l’heure, vous pouvez simplement enregistrer les secondes depuis minuit dans un Int32 ou (si vous ne voulez même pas les secondes) les minutes depuis minuit. s’intégrerait dans un Int16. Il serait sortingvial d’écrire les quelques méthodes nécessaires pour accéder à l’heure, aux minutes et aux secondes à partir d’une telle valeur.

La seule raison pour laquelle je peux penser à éviter DateTime / TimeSpan serait que la taille de la structure soit critique.

(Bien sûr, si vous utilisez un schéma simple comme celui ci-dessus enveloppé dans une classe, il serait également sortingvial de remplacer le stockage par un TimeSpan si vous réalisez soudainement que cela vous donnerait un avantage)