Получить DateTime.Now с точностью до миллисекунды

Как я могу точно построить временную метку фактического времени с точностью до миллисекунды?

Мне нужно что-то вроде 16.4.2013 9: 48: 00: 123. Это возможно? У меня есть приложение, где я выбираю значения 10 раз в секунду, и мне нужно показать их на графике.

Как я могу точно построить временную метку фактического времени с точностью до миллисекунды?

Я подозреваю, что вы имеете в виду миллисекундную точность . DateTime имеет большую точность, но довольно грубо с точки зрения точности. Вообще говоря, вы не можете. Обычно системные часы (с которых DateTime.Now получает свои данные) имеют разрешение около 10-15 мс. Более подробную информацию см. В блоге Эрика Липперта о точности и точности .

Если вам нужно более точное время, чем это, вы можете посмотреть на использование NTP-клиента.

Однако, не ясно, что вам действительно нужна миллисекундная точность здесь. Если вас не интересует точное время – вы просто хотите показать образцы в правильном порядке, с «довольно хорошей» точностью, тогда системные часы должны быть в порядке. Я бы посоветовал вам использовать DateTime.UtcNow а не DateTime.Now , чтобы избежать проблем с часовым поясом в переходных периодах перехода на летнее время и т. Д.

Если ваш вопрос фактически DateTime с преобразованием DateTime в строку с точностью до миллисекунды, я бы предложил использовать:

 string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture); 

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

Это должно работать:

 DateTime.Now.ToString("hh.mm.ss.ffffff"); 

Если вам не нужно, чтобы он отображался, и вам просто нужно знать разницу во времени, то не конвертируйте его в строку. Просто оставьте это как DateTime.Now();

И используйте TimeSpan чтобы узнать разницу между временными интервалами:

пример

 DateTime start; TimeSpan time; start = DateTime.Now; //Do something here time = DateTime.Now - start; label1.Text = String.Format("{0}.{1}", time.Seconds, time.Milliseconds.ToString().PadLeft(3, '0')); 

Я искал аналогичное решение, основываясь на том, что было предложено в этой теме, я использую следующую DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff") , и она работает как шарм. Обратите внимание: что .fff – это числа точности, которые вы хотите захватить.

Ответ Пиромантера кажется мне очень хорошим, но, возможно, вы хотели:

 DateTime.Now.Millisecond 

Но если вы сравниваете даты, TimeSpan – это путь.

Используйте DateTime Structure с миллисекундами и форматируйте вот так:

 string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture); timestamp = timestamp.Replace("-", "."); 

Насколько я понимаю, вы можете пойти:

 DateTime dateTime = DateTime.Now; DateTime dateTimeInMilliseconds = dateTime.AddTicks(-1 * dateTime.Ticks % 10000); 

Это сократит тики меньше 1 миллисекунды.

Если вам по-прежнему нужна дата вместо строки, как и другие ответы, просто добавьте этот метод расширения.

 public static DateTime ToMillisecondPrecision(this DateTime d) { return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second, d.Millisecond, d.Kind); } 

Проблема с DateTime.UtcNow и DateTime.Now заключается в том, что в зависимости от компьютера и операционной системы он может быть точным только от 10 до 15 миллисекунд. Тем не менее, на компьютерах Windows можно использовать с помощью функции низкого уровня GetSystemTimePreciseAsFileTime для получения точности микросекунды, см. Функцию GetTimeStamp() ниже.

  [System.Security.SuppressUnmanagedCodeSecurity, System.Runtime.InteropServices.DllImport("kernel32.dll")] static extern void GetSystemTimePreciseAsFileTime(out FileTime pFileTime); [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] public struct FileTime { public const long FILETIME_TO_DATETIMETICKS = 504911232000000000; // 146097 = days in 400 year Gregorian calendar cycle. 504911232000000000 = 4 * 146097 * 86400 * 1E7 public uint TimeLow; // least significant digits public uint TimeHigh; // most sifnificant digits public long TimeStamp_FileTimeTicks { get { return TimeHigh * 4294967296 + TimeLow; } } // ticks since 1-Jan-1601 (1 tick = 100 nanosecs). 4294967296 = 2^32 public DateTime dateTime { get { return new DateTime(TimeStamp_FileTimeTicks + FILETIME_TO_DATETIMETICKS); } } } public static DateTime GetTimeStamp() { FileTime ft; GetSystemTimePreciseAsFileTime(out ft); return ft.dateTime; } 
 public long millis() { return (long.MaxValue + DateTime.Now.ToBinary()) / 10000; } 

Если вы хотите использовать микросекунды, просто измените 10000 на 10 , и если вы хотите 10-го микро, удалите / 10000 .

DateTime.Now.ToString ( “ddMMyyyyhhmmssffff”)

Давайте будем гением компьютера.