web-dev-qa-db-fra.com

Convertir date/heure maintenant en secondes

J'essaie d'écrire une fonction qui convertira une instance DateTime.Now en nombre de secondes qu'elle représente pour pouvoir la comparer à une autre instance DateTime. Voici ce que j'ai actuellement:

public static int convertDateTimeToSeconds(DateTime dateTimeToConvert)
    {
        int secsInAMin = 60;
        int secsInAnHour = 60 * secsInAMin;
        int secsInADay = 24 * secsInAnHour;
        double secsInAYear = (int)365.25 * secsInADay;

        int totalSeconds = (int)(dateTimeToConvert.Year * secsInAYear) + 
                       (dateTimeToConvert.DayOfYear * secsInADay) +
                       (dateTimeToConvert.Hour * secsInAnHour) +
                       (dateTimeToConvert.Minute * secsInAMin) + 
                       dateTimeToConvert.Second;

        return totalSeconds;
    }

Je réalise que je tronque le calcul pour les secondes d'une année, mais je n'ai pas besoin que mon calcul soit précis. Je cherche vraiment à savoir si la méthode que j'utilise pour calculer les secondes est correcte.

Quelqu'un at-il quelque chose qui pourrait mieux calculer les secondes données à partir d'un objet DateTime? 

De plus, le type de retour doit-il être int64 si je code en C # si je vais calculer toutes les secondes depuis 0 AD?

14
TheDevOpsGuru

Le type DateTime _ supporte des opérateurs de comparaison :

if (dateTimeA > dateTimeB)
{
    ...

Cela fonctionne également pour les valeurs DateTime retournées par DateTime.AddSeconds :

if (dateTimeA.AddSeconds(42) > dateTimeB)
{
    ...

Si vous voulez vraiment le nombre de secondes écoulées depuis 01/01/0001 00:00:00 , vous pouvez calculer la différence entre les deux valeurs DateTime. La valeur résultante de TimeSpan _ a une propriété TotalSeconds :

double result = DateTime.Now.Subtract(DateTime.MinValue).TotalSeconds;
27
dtb

Convertir un objet DateTime en secondes n'a vraiment aucun sens. Les secondes n'ont de sens que si vous avez affaire à une période de temps (TimeSpan). Si vous souhaitez comparer deux dates pour obtenir le nombre de secondes entre elles:

TimeSpan diff = DateTime.Now - PreviousDateTime;
double seconds = diff.TotalSeconds;
8
rein

Voir la suggestion du fil ci-dessous:

Comment convertir les ticks en minutes?

TimeSpan.FromTicks(DateTime.Now.Ticks).TotalSeconds; 
6
Chris Baxter

Si l'objectif est de trouver le nombre de secondes entre deux dates, vous feriez bien mieux d'utiliser l'objet TimeSpan .

TimeSpan span = date2 - date1;
double seconds = span.TotalSeconds;
5
GendoIkari

Si vous souhaitez comparer deux objets DateTime, pourquoi ne pas utiliser les opérateurs fournis? http://msdn.Microsoft.com/en-us/library/aa326723%28v=VS.71%29. aspx

DateTime a, b;
if (a > b) //a is after b
4
RvdK

En supposant que vous ayez vraiment besoin d'obtenir les secondes pour l'objet datetime, vous pouvez obtenir directement la propriété "Ticks". Ce ne sont pas des secondes, mais vous pouvez facilement diviser par le facteur approprié pour convertir les ticks en secondes. Voir: http://msdn.Microsoft.com/en-us/library/system.datetime .ticks.aspx

Donc, quelque chose comme:

        DateTime.Now.Ticks/TimeSpan.TicksPerSecond
4
Joe L.

J'utiliserais la classe TimeSpan pour obtenir la différence exacte entre deux instances DateTime. Voici un exemple:

  DateTime dt1 = DateTime.Now;
  DateTime dt2 = new DateTime(2003,4,15);
  TimeSpan ts = dt1.Subtract(dt2);

Une fois que la valeur TimeSpan (ts, dans l'extrait de code ci-dessus) est disponible, vous pouvez examiner ses valeurs pour convertir correctement TimeSpan en un nombre de secondes donné.

3
JeffFerguson

Utiliser un TimeSpan pour obtenir le temps écoulé entre deux DateTimes est probablement la meilleure solution, mais si vous vraiment souhaitez obtenir le nombre de secondes pour une DateTime donnée, vous pouvez effectuer les opérations suivantes:

DateTime dateTimeToConvert = DateTime.Now;
TimeSpan tsElapsed = dateTimeToConvert - DateTime.MinValue;
return tsElapsed.TotalSeconds;

Notez que tsElapsed.TotalSeconds est un Double, pas un Int.

2
TLiebe

Notez que l'objectif est d'obtenir le nombre de secondes depuis DateTime.MinVal (le premier jour du calendrier). Je dis cela, car je vois toutes ces réponses car "vous faites des comparaisons temporelles comme celle-ci ... ajoutez l'objet, multipliez-le par cet objet et calculez-le en croix, divisez-le par le quotient du résultat obtenu, et Boom ! pas ce que vous avez demandé. "

Il y a une réponse très simple ici. Les ticks sont des incréments de 100 nanosecondes. DateTime object.Ticks est le nombre de ticks qui se sont produits depuis le 1/1/0001. C'est-à-dire l'année zéro. Il y a 10 millions de nanosecondes en une seconde. alors...

    public static long convertDateTimeToSeconds(DateTime dateTimeToConvert) {
        // According to Wikipedia, there are 10,000,000 ticks in a second, and Now.Ticks is the span since 1/1/0001. 
        long NumSeconds= dateTimeToConvert.Ticks / 10000000;
        return NumSeconds;
    }
0
Michieal