2009-09-10 6 views
4

Mon approche actuelle est quelque chose commeManière simple de gérer l'heure en C#?

DateTime startHour = new DateTime(1900,1,1,12,25,43); 
DateTime endHour = new DateTime(1900,1,1,13,45,32); 

// I need to, say, know if a complete DateTime instance 
// is later than startHour plus 15 minutes 

DateTime now = DateTime.Now(); 

startHour = startHour.addMinutes(15); 

if (now.CompareTo(new DateTime(now.Year, now.Month, now.Day, startHour.Hour, 
        startHour.Minute, startHour.Second)) > 0) 
{ 
    //I can do something now 
} 

Ceci est très lourd et même l'échec sujettes. TimeSpans ne sont pas une solution autant que je peux voir, car ils représentent des travées et ne sont pas liés par la limite de 24 heures (un TimeSpan de 56 heures 34 minutes est valide.)

Quelle est l'approche préférée pour ce type de calculs?

Qu'est-ce qui me manque? EDIT: Les calculs que je cherche sont des façons de comparer une instance complète de DateTime avec une heure, une minute, un deuxième triplet représentant une heure réelle et un moyen de fonctionner sur ces triplets (ajouter des heures, des minutes et des secondes).

EDIT 2: Merci à tous, j'ai compris l'essentiel de l'API DateTime, je pense. :) La seule chose qui me manque est un moyen de spécifier un TimeSpan qui devrait représenter un TimeOfDay seulement, mais c'est mineur.

+0

Quel est le problème que vous essayez de résoudre? Est-ce simplement que TimeSpan peut dépasser 24 heures? Parce que vous pouvez facilement vérifier cela. –

Répondre

9

Il est pas du tout clair ce que vous entendez par « est supérieure à startHour » ... mais en

TimeSpan startHour = new TimeSpan(12, 25, 43); 
if (endHour.TimeOfDay > startHour) 
{ 
    ... 
} 

... fonctionne assez simplement.

De toute façon ajouter une vérification des arguments pour vous assurer que vous ne spécifiez pas une valeur pour startHour qui est < 0 ou > 23 heures, mais tout cela est assez facile.

La date et l'heure de l'API .NET est assez primitive (même dans 3.5) par rapport à, disons, Joda Time - mais dans ce cas particulier je pense que ce n'est pas trop mal.

+1

C'est la première fois que j'entends quelqu'un se référer à l'API .NET date/heure comme "primitif" dans un ton négatif, et je ne pouvais pas être plus en désaccord. :) –

+0

@ 280Z284: Jusqu'à 3.5 vous ne pouviez même pas utiliser les fuseaux horaires non-locaux! Comparé à Joda, .NET est vraiment très primitif. Il n'y a pas de type représentant un instant avec un fuseau horaire associé - juste un décalage UTC. Blech. J'envisagerais de porter Joda si j'avais plus de temps. –

+0

Ouais, Joda se balance.Surtout par rapport à Java Datetime natif. –

0

Vous devriez utiliser TimeSpan pour startHour et endHour. Lors de la comparaison avec maintenant, vous devez les "convertir" en un DateTime complet ou obtenir l'heure avec DateTime.TimeOfDay comme mentionné par Jon Skeet.


TimeSpan startHour = new TimeSpan(12, 25, 43); 
DateTime now = DateTime.Now; 

if (now.CompareTo(DateTime.Today.Add(startHour)) > 0) { 
    //... 
} 

ou


TimeSpan startHour = new TimeSpan(12, 25, 43); 
DateTime now = DateTime.Now; 

if (now.TimeOfDay.CompareTo(startHour) > 0) { 
    //... 
} 
+0

Pourquoi le faire de cette façon au lieu de prendre l'heure actuelle? Et pourquoi utiliser CompareTo à la place de l'opérateur «supérieur à», surchargé? –

+0

J'utilise simplement son propre code. –

0

Vous êtes seulement intéressé par la composante temporelle de la date.

if(DateTime.Now.TimeOfDay > startHour.TimeOfDay) 
{ 
    // do stuff 
} 

Quel est le problème avec cela?

+0

Cela fonctionnera, mais la partie Date de startHour et endHour n'est pas nécessaire. –

+0

Oui, mais si vous supposez que l'extrait fourni est la seule partie du code qui utilise startHour. Mais que se passe-t-il si la valeur de date de startHour est utilisée ailleurs? –

2

Petit conseil: .NET prend en charge les opérations arithmétiques sur les objets DateTime et renvoie un objet TimeSpan. Ainsi, vous pouvez effectuer les opérations suivantes:

DateTime fromDate = .... 
DateTime toDate = .... 
TimeSpan diff = toDate - fromDate; 

et vous pouvez étendre cela:

DateTime fromDate = DateTime.Now; 
DateTime toDate = DateTime.Now.addMinutes(x); 

if ((toDate - fromDate).TotalMinutes > 15) { 
    ... 
} 
Questions connexes