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

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

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

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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'));

Ответ 3

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

Ответ 4

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

DateTime.Now.Millisecond

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

Ответ 5

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

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

Ответ 6

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

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

Это приведет к отключению тиков меньше 1 миллисекунды.

Ответ 7

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

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

Ответ 8

Проблема с 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;
    }

Ответ 10

public long millis() {
  return (long.MaxValue + DateTime.Now.ToBinary()) / 10000;
}

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

Ответ 11

Пожалуйста, смотрите здесь: код:  (DateTime.UtcNow - новый DateTime (1970, 1, 1)). TotalMilliseconds Контрольная работа: https://currentmillis.com/

Ответ 12

DateTime.Now.ToString( "ddMMyyyyhhmmssffff" )