2009-10-07 8 views
0

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

Основные данные имеют точность , чем миллисекунды.

я в конечном итоге построения промежуточного DateTime с точностью до секунды, чтение его значение в клещей (10 000 миллисекунды), регулируя тиков, то создавая DateTime, что я на самом деле хотел .

Я ожидал, что конструкторы взяли секунд в два раза и занимает строка даты/времени в формате спецификатор. Ничего не существует.

У кого-то есть хороший альтернативный подход?

+0

FWIW, я согласен с вами. Разработчикам .Net было бы легко включить конструкторы для класса TimeSpan, в котором были использованы параметры «double». Однако их достаточно легко написать (как вы поняли). – MusiGenesis

+0

Да, ты прав, это не так сложно. Это тот факт, что это необходимо, что меня удивляет. У нас есть тип, который имеет точность до 100 наносекунд (7 цифр после точки) и не имеет собственного способа использовать это. Я не понимаю дизайн конструкторов. Вы бы оставили такую ​​дыру? –

+0

Согласен. Конструктор тиков завершен, так как он может использоваться для построения всех возможных значений DateTime. С другой стороны, конструкторы стиля year, month, day и т. Д. Неполны, так как не могут построить все мыслимые значения DateTime и могут создавать только значения, время которых падает на целые миллисекунды. Они абсолютно должны были сделать параметр seconds двойным или добавить аналогичный конструктор с наносекундной точностью. Они предоставили кусочно-конструктивные конструкторы для всего до миллисекунды, но затем не сделали кусочно-конструктора для наносекунд. Ламе. – Triynko

ответ

4

Нет прямого способа создать экземпляр класса DateTime на основе долей секунды. Самое близкое, что вы можете получить, как вы обнаружили, использует тики. Подобная функция должна по крайней мере избавить вас от необходимости создавать несколько DateTime s в каждом случае.

public DateTime DateTimeFromFractionalSeconds(int year, int month, int day, int hour, int minute, double seconds) 
{ 
    return new DateTime(year, month, day, hour, minute).AddTicks((long)(seconds * 1000000000)); 
} 

Вы правы, что дизайнеры могли включить такой конструктор. Однако класс DateTime не основан на секундах больше, чем на несколько минут. Я понимаю, что вам нужны дробные секунды, но можете ли вы действительно сделать так, чтобы дробные секунды были более легитимными, чем дробные минуты? Или часы? Класс DateTime основан на тиках. Это наименьшая неделимая единица измерения, с которой она имеет дело, поэтому самый гранулированный конструктор представлен в тиках.

+0

Я использовал это в своем решении. Однако это довольно глупый подход. У меня есть datetime в годах, месяцах ... дробных секундах. Я должен преобразовать это в тики, чтобы затем создать дату-время, в которое я действительно хочу использовать тики. Истинная идиотская процедура. –

+0

Если это предоставило вам решение, то помечаться как принятое было бы оценено! –

+0

Нет, это не решение. Я уже это сделал. Я искал лучший способ, или, может быть, какой-то недокументированный подход, который делал то, что я ожидал. –

1

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

+0

Вы полностью имеете право на свое мнение о точном времени, но вы должны держать его в себе. Без знания сатировки вы можете легко сказать что-то не так. (Подсказка различается между временем, которое уже зарегистрировано в отношении одних и тех же часов, но очень близко друг к другу.) Да, я использовал гораздо более точные таймеры с .NET 1, они действительно хороши, но они бесполезны здесь. –