Получите время в миллисекундах, используя C#
Я делаю программу, в которой мне нужно получить время в миллисекундах. Под временем я подразумеваю число, которое никогда не равно себе, и всегда на 1000 чисел больше, чем было секунду назад. Я пытался конвертировать DateTime.Now
к TimeSpan
и получить TotalMilliseconds
от этого... но я слышал, что это не совсем точно.
Есть ли более простой способ сделать это?
10 ответов
Использовать Stopwatch
учебный класс.
Предоставляет набор методов и свойств, которые можно использовать для точного измерения прошедшего времени.
Здесь есть хорошая информация о его реализации:
Тесты производительности: точные измерения времени выполнения с помощью System.Diagnostics.Stopwatch
long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
Это на самом деле, как различные методы преобразования Unix реализованы в DateTimeOffset
класс (.NET Framework 4.6+, .NET Standard 1.3+):
long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();
DateTime.Ticks
свойство получает количество тиков, представляющих дату и время.
10000 тиков - это миллисекунды (10000000 тиков в секунду).
Я использую следующий класс. Однажды я нашел это в Интернете, постулируя, чтобы быть СЕЙЧАС ().
/// <summary>Class to get current timestamp with enough precision</summary>
static class CurrentMillis
{
private static readonly DateTime Jan1St1970 = new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
/// <summary>Get extra long current timestamp</summary>
public static long Millis { get { return (long)((DateTime.UtcNow - Jan1St1970).TotalMilliseconds); } }
}
Источник неизвестен.
Вы можете попробовать QueryPerformanceCounter
родной метод. См. http://www.pinvoke.net/default.aspx/kernel32/QueryPerformanceCounter.html для получения дополнительной информации. Это то, что Stopwatch
класс использует.
См. Как получить временную метку точности тиков в.NET / C#? для дополнительной информации.
Stopwatch.GetTimestamp()
дает доступ к этому методу:
public static long GetTimestamp() {
if(IsHighResolution) {
long timestamp = 0;
SafeNativeMethods.QueryPerformanceCounter(out timestamp);
return timestamp;
}
else {
return DateTime.UtcNow.Ticks;
}
}
Я использовал DateTime.Now.TimeOfDay.TotalMilliseconds (для текущего дня), надеюсь, он вам тоже поможет.
Использование System.DateTime.Now.ToUniversalTime()
, Это помещает ваше чтение в известный справочный миллисекундный формат, который полностью исключает смену дня и т. Д.
Используя класс Stopwatch, мы можем добиться этого из
System.Diagnostics
.
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
stopwatch.Stop();
Debug.WriteLine(stopwatch.ElapsedMilliseconds);
System.DateTimeOffset.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt")
чтобы получить миллисекунду в формате '04 / 01/2021 04:32:14.788 PM'
Насколько я понимаю ваши требования, Environment.TickCount отвечает всем требованиям . Он возвращает количество миллисекунд с момента запуска, поэтому всегда увеличивается и может использоваться для вычисления прошедшего времени в миллисекундах. Если вам также нужно абсолютное время, вы можете получить текущее время и текущий Environment.TickCount и вычислить новое абсолютное время на основе этого и нового Environment.TickCount.