Как получить метку времени точности галочки в.NET / C#?

Я использую формат .ico и помещаю следующие две строки в <head> элемент:

<link rel="icon" href="/favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
61
задан Peter Mortensen 2 September 2010 в 14:12
поделиться

5 ответов

Значение системных часов, которое считывает DateTime.Now , обновляется только каждые 15 мс или около того (или 10 мс в некоторых системах), поэтому время квантуются вокруг этих интервалов. Существует дополнительный эффект квантования, который является результатом того факта, что ваш код работает в многопоточной ОС, и, таким образом, есть участки, где ваше приложение не «живое» и, следовательно, не измеряет реальное текущее время.

Поскольку вы ' При поиске сверхточного значения отметки времени (в отличие от простого измерения произвольной продолжительности) класс Секундомер сам по себе не будет делать то, что вам нужно. Я думаю, вам придется сделать это самостоятельно, используя своего рода гибрид DateTime / Секундомер . Когда ваше приложение запускается, вы сохраняете текущее DateTime.

56
ответ дан 24 November 2019 в 17:13
поделиться

Он действительно возвращает наиболее точные дату и время, известные операционной системе.

Операционная система также обеспечивает более высокое разрешение синхронизации с помощью QueryPerformanceCounter и QueryPerformanceFrequency (класс .NET Секундомер ). Они позволяют вам измерять интервал, но не дают вам дату и время дня. Вы можете возразить, что они могут дать вам очень точное время и день, но я не уверен, насколько сильно они искажаются в течение длительного интервала.

8
ответ дан 24 November 2019 в 17:13
поделиться

1). Если вам нужна абсолютная точность с высоким разрешением: вы не можете использовать DateTime.Now когда он основан на часах с интервалом 15 мс (если он можно «сдвинуть» фазу).

Вместо этого внешний источник с лучшим разрешением абсолютного время точности (например, ntp), t1 ниже, может быть объединено с высоким таймер разрешения (StopWatch / QueryPerformanceCounter).


2). Если вам просто нужно высокое разрешение:

Пример DateTime.Now ( t1 ) один раз вместе со значением из таймер высокого разрешения (StopWatch / QueryPerformanceCounter) ( tt0 ).

Если текущее значение таймера высокого разрешения равно tt , то текущее время, t , составляет:

t = t1 + (tt - tt0)

3). Альтернативой может быть разделение абсолютного времени и порядок финансовых событий: одно значение для абсолютного времени (Разрешение 15 мс, возможно отклонение на несколько минут) и один значение для заказа (например, увеличение значения на единицу каждый время и сохраните это). Начальная стоимость заказа может быть на основе некоторого глобального значения системы или быть производным от абсолютное время при запуске приложения.

Это решение было бы более надежным, поскольку оно не зависит от базовая аппаратная реализация часов / таймеров (это может варьироваться в зависимости от системы).

4
ответ дан 24 November 2019 в 17:13
поделиться

Если требуется временная метка для выполнения тестов, используйте StopWatch , который имеет гораздо лучшую точность, чем DateTime.Now.

0
ответ дан 24 November 2019 в 17:13
поделиться

Точность 15 мс (на самом деле это может быть 15-25 мс) основана на разрешении таймера Windows 55 Гц / 65 Гц. Это также основной период TimeSlice. Затронуты Windows.Forms.Timer , Threading.Thread.Sleep , Threading.Timer и т. Д.

Чтобы получить точные интервалы, вы должны использовать Класс секундомера . Если доступно, будет использоваться высокое разрешение. Попробуйте следующие утверждения, чтобы узнать:

Console.WriteLine("H = {0}", System.Diagnostics.Stopwatch.IsHighResolution);
Console.WriteLine("F = {0}", System.Diagnostics.Stopwatch.Frequency);
Console.WriteLine("R = {0}", 1.0 /System.Diagnostics.Stopwatch.Frequency);

Я получаю R = 6E-08 сек, или 60 нс. Этого должно хватить для вашей цели.

2
ответ дан 24 November 2019 в 17:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: