web-dev-qa-db-fra.com

Obtenez DateTime.Now avec une précision en millisecondes

Comment puis-je construire exactement un horodatage de l'heure réelle avec une précision millisecondes? 

J'ai besoin de quelque chose comme 16.4.2013 9: 48: 00: 123. Est-ce possible? J'ai une application où j'échantillonne les valeurs 10 fois par seconde et je dois les afficher dans un graphique.

187
LuckyHK

Comment puis-je construire exactement un horodatage de l'heure réelle avec une précision millisecondes?

Je suppose que vous voulez dire milliseconde précision. DateTime a beaucoup de précision, mais est assez grossier en termes de précision. De manière générale, vous ne pouvez pas. Habituellement, l'horloge système (où DateTime.Now récupère ses données) a une résolution d'environ 10-15 ms. Voir l'article du blog d'Eric Lippert sur la précision et l'exactitude pour plus de détails.

Si vous avez besoin d'un chronométrage plus précis que cela, vous pouvez envisager d'utiliser un client NTP.

Cependant, il n'est pas clair que vous ayez vraiment besoin d'une précision à la milliseconde ici. Si vous ne vous souciez pas du minutage exact - vous voulez simplement afficher les échantillons dans le bon ordre, avec une précision "assez bonne", l'horloge système devrait alors fonctionner correctement. Je vous conseillerais toutefois d'utiliser DateTime.UtcNow plutôt que DateTime.Now, afin d'éviter les problèmes de fuseau horaire autour des transitions d'été, etc.

Si votre question est réellement convertissant juste une DateTime en chaîne avec une précision de l'ordre de la milliseconde, nous vous suggérons d'utiliser:

string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff",
                                            CultureInfo.InvariantCulture);

(Notez que contrairement à votre échantillon, ceci est triable et moins susceptible de créer une confusion quant à savoir si cela doit être "mois/jour/année" ou "jour/mois/année".)

259
Jon Skeet

Cela devrait fonctionner:

DateTime.Now.ToString("hh.mm.ss.ffffff");

Si vous n'avez pas besoin de l'afficher et que vous souhaitez simplement connaître le décalage horaire, ne le convertissez pas en chaîne. Il suffit de le laisser comme, DateTime.Now();

Et utilisez TimeSpan pour connaître la différence entre les intervalles de temps:

Exemple

DateTime start;
TimeSpan time;

start = DateTime.Now;

//Do something here

time = DateTime.Now - start;
label1.Text = String.Format("{0}.{1}", time.Seconds, time.Milliseconds.ToString().PadLeft(3, '0'));
101
Pyromancer

Je cherchais une solution similaire, basée sur ce qui a été suggéré sur ce fil, j'utilise ce qui suit DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff") , et cela fonctionne à merveille. Remarque: ce .fff correspond aux nombres de précision que vous souhaitez capturer.

19
Jozcar

La réponse de Pyromancer me semble plutôt bonne, mais vous vouliez peut-être:

DateTime.Now.Millisecond

Mais si vous comparez des dates, TimeSpan est la voie à suivre.

15
Renae

Utilisez la structure DateTime avec millisecondes et formatez comme ceci:

string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", 
CultureInfo.InvariantCulture);
timestamp = timestamp.Replace("-", ".");
10
Jacman

Pour autant que je comprenne la question, vous pouvez choisir:

DateTime dateTime = DateTime.Now;
DateTime dateTimeInMilliseconds = dateTime.AddTicks(-1 * dateTime.Ticks % 10000); 

Cela éliminera les ticks inférieurs à 1 milliseconde.

3
Roland Dietz

Si vous voulez toujours une date au lieu d'une chaîne comme les autres réponses, ajoutez simplement cette méthode d'extension.

public static DateTime ToMillisecondPrecision(this DateTime d) {
    return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute,
                        d.Second, d.Millisecond, d.Kind);
}
3
birch

Le problème avec DateTime.UtcNow et DateTime.Now est que, en fonction de l'ordinateur et du système d'exploitation, il se peut que la précision ne soit comprise qu'entre 10 et 15 millisecondes. Cependant, sur les ordinateurs Windows, on peut utiliser la fonction de bas niveau GetSystemTimePreciseAsFileTime pour obtenir une précision à la microseconde, voir la fonction GetTimeStamp() ci-dessous.

    [System.Security.SuppressUnmanagedCodeSecurity, System.Runtime.InteropServices.DllImport("kernel32.dll")]
    static extern void GetSystemTimePreciseAsFileTime(out FileTime pFileTime);

    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct FileTime  {
        public const long FILETIME_TO_DATETIMETICKS = 504911232000000000;   // 146097 = days in 400 year Gregorian calendar cycle. 504911232000000000 = 4 * 146097 * 86400 * 1E7
        public uint TimeLow;    // least significant digits
        public uint TimeHigh;   // most sifnificant digits
        public long TimeStamp_FileTimeTicks { get { return TimeHigh * 4294967296 + TimeLow; } }     // ticks since 1-Jan-1601 (1 tick = 100 nanosecs). 4294967296 = 2^32
        public DateTime dateTime { get { return new DateTime(TimeStamp_FileTimeTicks + FILETIME_TO_DATETIMETICKS); } }
    }

    public static DateTime GetTimeStamp() { 
        FileTime ft; GetSystemTimePreciseAsFileTime(out ft);
        return ft.dateTime;
    }
1
Stochastically

essayez d'utiliser datetime.now.ticks. cela fournit une précision nanoseconde. prendre le delta de deux ticks (stoptick - starttick)/10 000 est la milliseconde de l'intervalle spécifié.

https://docs.Microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=netframework-4.7.2

0
darkstar