Получите время в миллисекундах, используя С#

Я делаю программу, в которой мне нужно получить время в миллисекундах. Со временем я имею в виду число, которое никогда не совпадает с самим собой и всегда на 1000 чисел больше, чем было уже второй месяц назад. Я попытался преобразовать DateTime.Now в TimeSpan и получить TotalMilliseconds от этого... но я слышал, что это не совсем точно.

Есть ли более простой способ сделать это?

Ответ 1

Используйте класс Stopwatch.

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

Здесь есть хорошая информация о его реализации:

Тесты производительности: точные измерения времени выполнения с помощью System.Diagnostics.Stopwatch

Ответ 2

long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

На самом деле, как различные методы преобразования Unix реализованы в классе DateTimeOffset (.NET Framework 4.6+,.NET Standard 1.3 +):

long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();

Ответ 3

Свойство DateTime.Ticks получает количество тиков, которые представляют дату и время.

10 000 Клещи - миллисекунда (10 000 000 тиков в секунду).

Ответ 4

Вы можете попробовать собственный метод QueryPerformanceCounter. Подробнее см. http://www.pinvoke.net/default.aspx/kernel32/QueryPerformanceCounter.html. Это то, что использует класс Stopwatch.

См. Как получить метку времени тика в .NET/С#? для получения дополнительной информации.

Stopwatch.GetTimestamp() предоставляет доступ к этому методу:

public static long GetTimestamp() {
     if(IsHighResolution) {
         long timestamp = 0;
         SafeNativeMethods.QueryPerformanceCounter(out timestamp);
         return timestamp;
     }
     else {
         return DateTime.UtcNow.Ticks;
     }
 }

Ответ 5

Я использую следующий класс. Я нашел его в Интернете один раз, постулировал, чтобы быть лучшим СЕЙЧАС().

/// <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); } }
}

Источник неизвестен.

Ответ 6

Я использовал DateTime.Now.TimeOfDay.TotalMilliseconds(для текущего дня), надеюсь, он также поможет вам.

Ответ 7

Используйте System.DateTime.Now.ToUniversalTime(). Это делает ваше чтение в известном стандартном миллисекундовом формате, который полностью исключает изменение дня и т.д.

Ответ 8

Согласно ответу "Секундомер", я провел несколько тестов на CodinGame и получил... тревожно разные результаты.

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Numerics;
using System.Diagnostics;

class Player
{
  static void Main(string[] args)
  {
    Stopwatch timeWatcher = new Stopwatch();
    timeWatcher.Start();
    Console.Error.WriteLine("Starting at " + timeWatcher.ElapsedMilliseconds + "ms");
    Console.Error.WriteLine("Starting at " + DateTime.Now.Millisecond + "ms");

        // Do Some Complex Stuff, none of it touching StopWatch

    timeWatcher.Stop();
    Console.Error.WriteLine("Ending at " + timeWatcher.ElapsedMilliseconds + "ms");
    Console.Error.WriteLine("Ending at " + DateTime.Now.Millisecond + "ms");
    }
  }
}
// A bunch of other classes that run the game.  Again, nothing touches anything to do with time.

Мой вывод был следующим

>Starting at 9ms
>Starting at 80ms
>Ending at 2568ms
>Ending at 641ms

Для моих целей DateTime.Now.Millisecond кажется гораздо более точным. CodinGame, как правило, специально для этой игры, имеет довольно строгое условие: "Время отклика на вывод составляет ≤ 1 с". Так что моя программа не могла работать более 2000 мс. Теперь это может быть полностью, что они связываются с DateTime.Now

Делай из этого что хочешь.