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.
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".)
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'));
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.
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.
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("-", ".");
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.
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);
}
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;
}
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