Получите время в миллисекундах, используя С#
Я делаю программу, в которой мне нужно получить время в миллисекундах. Со временем я имею в виду число, которое никогда не совпадает с самим собой и всегда на 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
Делай из этого что хочешь.