Получите время в миллисекундах, используя 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'

https://docs.microsoft.com/en-us/dotnet/standard/base-types/how-to-display-milliseconds-in-date-and-time-values

Насколько я понимаю ваши требования, Environment.TickCount отвечает всем требованиям . Он возвращает количество миллисекунд с момента запуска, поэтому всегда увеличивается и может использоваться для вычисления прошедшего времени в миллисекундах. Если вам также нужно абсолютное время, вы можете получить текущее время и текущий Environment.TickCount и вычислить новое абсолютное время на основе этого и нового Environment.TickCount.

Другие вопросы по тегам