Как мне перейти от Stopwatch.GetTimestamp () к DateTime?

Дубликат: Как получить метку времени точности тика в. NET / C #?
Как перейти от Stopwatch.GetTimestamp () к DateTime

Предположим, что Stopwatch.IsHighResolution истинно


person Simon    schedule 17.09.2009    source источник


Ответы (2)


Если это счетчик с высоким разрешением, нет никакой гарантии, что значение имеет какую-либо корреляцию с реальным временем - например, это вполне может быть «тики с момента загрузки компьютера». Для таймера с не высоким разрешением вы можете использовать new DateTime(Stopwatch.GetTimestamp()), но это не обязательно даст полезное значение для таймера с высоким разрешением. (На моей коробке этого точно нет.)

Для чего вы пытаетесь это использовать? Идея Stopwatch заключается в измерении интервалов времени.

person Jon Skeet    schedule 17.09.2009
comment
Хотел спросить, почему нет корреляции? Такты ОС постоянны, поэтому 100 мс должны быть очень похожи на 100 мс на любых часах (с точки зрения интервала). Единственный способ, которым они должны отличаться, - это сдвиг между реальным временем и инициализацией тикового счетчика ОС, верно? После инициализации счетчика тиков Os длина интервала должна быть такой же, как у любых точных часов? - person Mindaugas Bernatavičius; 27.07.2017
comment
@Mindaugas: системные часы могли измениться из-за изменения часового пояса, ручной корректировки времени или автоматической корректировки, например. через NTP. Дело в том, что если вы хотите измерить прошедшее время, вы используете секундомер, но он не выдаст вам DateTime, потому что он измеряет только прошедшее время. - person Jon Skeet; 27.07.2017
comment
Большое спасибо! Я думал о более коротком временном диапазоне, но спасибо за то, что дал мне больше понимания. - person Mindaugas Bernatavičius; 27.07.2017

Имейте в виду, что если вы пытаетесь отслеживать прошедшее время, вам следует использовать:

Stopwatch sw = Stopwatch.StartNew();
//do stuff
sw.Elapsed; //or
sw.ElapsedMilliseconds;

Это точно переводит тики в реальное время. Преобразование тиков в DateTime, а затем сравнение DateTimes также будет работать, но приведенное выше проще.

Некоторые (в том числе и я) ошибочно использовали такой код, и у них были плохие времена:

startTime = Stopwatch.GetTimestamp();

totalTime = (Stopwatch.GetTimestamp() - startTime) / 10000; 
//it was assumed 10,000 ticks was a millisecond, incorrectly
person Dmitri R117    schedule 16.10.2015
comment
Секундомер.Частота, то есть количество тиков пр. sec, можно использовать для исправления вашего последнего примера: elapsedMs = (Stopwatch.GetTimestamp () - startTime) / (Stopwatch.Frequency / 1000); - person Jens; 11.11.2016