2015-03-20 2 views
0

Это странный вопрос, но учитывая следующие результаты ...Как я могу объяснить очень небольшое количество времени?

DateTime.MaxValue.Ticks; 

= 3155378975999999999

new DateTime(DateTime.MaxValue.Year, 
      DateTime.MaxValue.Month, 
      DateTime.MaxValue.Day, 
      DateTime.MaxValue.Hour, 
      DateTime.MaxValue.Minute, 
      DateTime.MaxValue.Second, 
      DateTime.MaxValue.Millisecond) 
     .Ticks; 

= 3155378975999990000

(И да, я знаю, что это можно сделать , однако ...)

new DateTime(DateTime.MaxValue.Ticks); 

Что это за 9999 т icks представляют? Как я могу объяснить только отсутствующие 9999 тиков вручную? Например, предположим, что они представляют собой наносекунды. Могу ли я создать метод AddNanoseconds?

Спасибо!

+5

Там это уже 'метод AddTicks'. Также в документах четко указано, что каждый тик равен 100 нс (так 10 тиков = 1 микросекунда). –

+0

Надеюсь, вы не пытаетесь * измерить * время до этой точности с помощью 'DateTime.Now' или' DateTime.UtcNow'. Точность часов в реальном времени компьютера нигде не столь точна, как объект 'DateTime' может фактически хранить. Если вы измеряете вещи, вместо этого используйте 'System.Diagnostics.Stopwatch'. –

ответ

3

DateTime.MaxValue.Ticks находится в тиках, а максимальная дата «останавливается» на Millisecond, поэтому последние 9999 тиков не включены.

Простой пример, чтобы сделать это совершенно ясно:

var maxTicks = DateTime.MaxValue.Ticks; 
Console.WriteLine("Max ticks:"); 
Console.WriteLine(maxTicks); // 3155378975999999999 

var maxedDate = new DateTime(DateTime.MaxValue.Year, 
          DateTime.MaxValue.Month, 
          DateTime.MaxValue.Day, 
          DateTime.MaxValue.Hour, 
          DateTime.MaxValue.Minute, 
          DateTime.MaxValue.Second, 
          DateTime.MaxValue.Millisecond); 

var ticksFromDate = maxedDate.Ticks; 
Console.WriteLine("Max ticks from date:"); 
Console.WriteLine(ticksFromDate); // 3155378975999990000 

var withExtraTicks = maxedDate.AddTicks(9999); 
Console.WriteLine("Max date with ticks added:"); 
Console.WriteLine(withExtraTicks.Ticks); // 3155378975999999999 

try{ 
    var tooLong = withExtraTicks.AddTicks(1); 
    Console.WriteLine("Note: This line will only be shown if run on Diskworld."); 
} 
catch(Exception ex){ 
    Console.WriteLine("Failed! Message:"); 
    // Will show the message: 
    // "The added or subtracted value results in an un-representable DateTime." 
    Console.WriteLine(ex.Message); 
}