142 votes

Obtenir le temps en millisecondes en utilisant C#

Je fais un programme dans lequel j'ai besoin d'obtenir le temps en millisecondes. Par temps, j'entends un nombre qui n'est jamais égal à lui-même, et qui est toujours 1000 fois plus grand qu'il y a une seconde. J'ai essayé de convertir DateTime.Now à un TimeSpan et obtenir le TotalMilliseconds de ça... mais j'ai entendu dire que ce n'était pas parfaitement exact.

Existe-t-il un moyen plus simple de procéder ?

0 votes

Vous attendez-vous à ce que deux appels conduisent toujours à des valeurs croissantes ? En général, les appels plus rapprochés que l'intervalle minimum que la résolution de la minuterie autorise donneront la même valeur. Vous devrez ajouter votre propre moyen de départager les valeurs sous la forme d'un sérialiseur de fausse précision.

18 votes

"Un nombre qui n'est jamais égal à lui-même". Ça a l'air... compliqué. ;)

1 votes

NaN correspondrait à cette exigence en fait. Bien que ce ne soit pas un nombre, c'est un type de nombre, et il n'est pas égal à lui-même.

378voto

Evan Mulawski Points 28536
long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

C'est en fait la manière dont les différentes méthodes de conversion Unix sont implémentées dans le programme DateTimeOffset (.NET Framework 4.6+, .NET Standard 1.3+) :

long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();

70 votes

Le titre est "obtenir le temps en millisecondes". Cette réponse est utile.

35 votes

Oui, pour ceux d'entre nous qui cherchent une réponse à la question posée, c'était très utile, merci.

1 votes

Si vous voulez des décimales (même si DateTime.Now n'est pas "mis à jour" très souvent), bien sûr utilisez decimal milliseconds = DateTime.Now.Ticks / (decimal)TimeSpan.TicksPerMillisecond; à la place.

80voto

RedFilter Points 84190

Utilisez le Stopwatch classe.

Fournit un ensemble de méthodes et de propriétés que vous pouvez utiliser pour mesurer avec précision le temps écoulé.

Vous trouverez de bonnes informations sur sa mise en œuvre ici :

Tests de performance : Mesures précises du temps d'exécution avec System.Diagnostics.Stopwatch

8 votes

Chronomètre fait partie des Diagnostics. Doit-on l'utiliser dans du code réel ?

5 votes

0 votes

La précision est normalement de l'ordre de 15 ms.

14voto

Itay Karo Points 10446

El DateTime.Ticks permet d'obtenir le nombre de ticks qui représentent la date et l'heure.

10 000 Ticks est une milliseconde (10 000 000 de ticks par seconde).

4 votes

Mais la résolution des Ticks est très inférieure à 1/10000s, peut-être 1/62s.

2 votes

@codymanix - de MSDN : A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond.

6 votes

Bien sûr, mais le système d'exploitation n'a pas la résolution nécessaire pour être aussi précis.

8voto

Pieter van Ginkel Points 17057

Vous pouvez essayer le QueryPerformanceCounter méthode native. Voir http://www.pinvoke.net/default.aspx/kernel32/QueryPerformanceCounter.html pour plus d'informations. Voici ce que le Stopwatch la classe utilise.

Ver Comment obtenir l'horodatage de la précision du tick en .NET / C# ? pour plus d'informations.

Stopwatch.GetTimestamp() donne accès à cette méthode :

public static long GetTimestamp() {
     if(IsHighResolution) {
         long timestamp = 0;
         SafeNativeMethods.QueryPerformanceCounter(out timestamp);
         return timestamp;
     }
     else {
         return DateTime.UtcNow.Ticks;
     }
 }

1 votes

AFAIK StopWatch utilise QueryPerformanceCounter en interne s'il est disponible.

0 votes

Yep, l'implémentation interne de Stopwatch.GetTimestamp() permet en fait d'accéder à cette méthode.

5voto

Sarvan Points 124

J'ai utilisé DateTime.Now.TimeOfDay.TotalMilliseconds (pour le jour actuel), j'espère que cela vous aidera également.

1 votes

Qui ne renverra pas de valeurs croissantes (comme l'a demandé l'expéditeur initial) puisque TimeOfDay est remis à zéro tous les jours à minuit. De plus, il y aurait les mêmes problèmes potentiels que l'afficheur a mentionné en utilisant simplement DateTime.Now et en obtenant le total des millisecondes à partir de cela.

3 votes

Jim O'Neil Je suis d'accord avec vous, c'est pourquoi j'ai mentionné "(pour le jour présent)" dans mon message... En fait, ma solution a fonctionné pour mon problème, car mon problème n'est pas spécifique à la date, j'avais simplement besoin d'obtenir la partie Millisecondes pour être utilisé comme un compteur, donc je l'ai posté ici. Je suis nouveau ici, donc si je l'ai posté à un mauvais endroit, je suis désolé :)

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