Преобразовать разницу между 2 раза в миллисекунды?

У меня есть два замаскированных элемента управления TextBox, и мне было интересно, как я буду получать время в каждом из них, а затем преобразовывать разницу в миллисекунды. Например, скажем, в tb1 я пишу «12:01», а в tb2 я пишу «12:02», а затем нажимаю кнопку. После нажатия кнопки запускается таймер, и в 12:02 отображается окно сообщения. Я знаю, как сделать все это, кроме части преобразования времени.

Как этого добиться?


person jay_t55    schedule 28.09.2009    source источник
comment
Ваш вопрос не ясен. Вы не знаете, как получить разницу между двумя DateTime или как преобразовать 12:01 в DateTime?   -  person Viktor Jevdokimov    schedule 28.09.2009


Ответы (9)


Чтобы ответить на вопрос заголовка:

DateTime d1 = ...;
DateTime d2 = ...;
TimeSpan diff = d2 - d1;

int millisceonds = (int) diff.TotalMilliseconds;

Вы можете использовать это, чтобы установить таймер:

timer1.interval = millisceonds;
timer1.Enabled = true;

Не забудьте отключить таймер при обработке тика.

Но если вы хотите, чтобы событие было в 12:03, просто замените DateTime.Now на d1.

Но неясно, какова точная функция textBox1 и textBox2.

person Henk Holterman    schedule 28.09.2009
comment
Вам нужно использовать TotalMilliseconds, а не Milliseconds. - person MusiGenesis; 28.09.2009
comment
Вам нужно TotalMilliseconds, а не Milliseconds. Миллисекунды дадут вам только миллисекундный остаток разницы во времени, а не весь промежуток времени. 2,475 секунды дают миллисекунды = 475, всего миллисекунд = 2475. - person StarPacker; 28.09.2009

Вы должны преобразовать значения текстового поля в DateTime (t1, t2), затем:

DateTime t1,t2;
t1 = DateTime.Parse(textbox1.Text);
t2 = DateTime.Parse(textbox2.Text);
int diff = ((TimeSpan)(t2 - t1)).TotalMilliseconds;

Или используйте DateTime.TryParse(textbox1, out t1); Обработка ошибок зависит от вас.

person Viktor Jevdokimov    schedule 28.09.2009
comment
Вы были правы в первый раз: вам нужно использовать TotalMilliseconds (если вам не нравится каждый раз возвращать 0). - person MusiGenesis; 28.09.2009

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

DateTime firstTime = DateTime.Parse( TextBox1.Text );
DateTime secondTime = DateTime.Parse( TextBox2.Text );
double milDiff = secondTime.Subtract(firstTime).TotalMilliseconds;

Соображения:
- earlierTime.Subtract(laterTime) вы получите отрицательное значение.
- используйте int milDiff = (int)DateTime.Now.Subtract(StartTime).TotalMilliseconds;, если вам нужно целочисленное значение вместо двойного
- тот же код можно использовать для получения разницы между двумя значениями даты, и вы можете получить .TotalDays или .TotalHours вместо .TotalMilliseconds

person E Malik    schedule 09.05.2014

Если вы имеете дело только с Times и без дат, вам нужно иметь дело только с TimeSpan и обрабатывать пересечение полуночи.

TimeSpan time1 = ...;  // assume TimeOfDay
TimeSpan time2 = ...;  // assume TimeOfDay
TimeSpan diffTime = time2 - time1;
if (time2 < time1)  // crosses over midnight
    diffTime += TimeSpan.FromTicks(TimeSpan.TicksPerDay);
int totalMilliSeconds = (int)diffTime.TotalMilliseconds;
person DRBlaise    schedule 28.09.2009

Попробуйте следующее:

   DateTime dtStart;
   DateTime dtEnd;

   if (DateTime.TryParse( tb1.Text, out dtStart ) && DateTime.TryParse(tb2.Text, out dtEnd ))
   {
      TimeSpan ts = dtStart - dtEnd;
      double difference = ts.TotalMilliseconds;
   }
person TLiebe    schedule 28.09.2009

Если вы просто хотите отобразить окно сообщения в 12:02, используйте элемент управления таймером с задержкой, скажем, 250 мс, который постоянно проверяет, является ли текущее время 12:02. Когда это произойдет, отобразите сообщение и остановите таймер. Обратите внимание, что для этого не требуется поле времени начала (хотя вы можете использовать его для чего-то другого — я не знаю — в этом случае другой код, предоставленный вам здесь, будет полезен).

person Jon Seigel    schedule 28.09.2009

Пытаться:

DateTime first;
DateTime second;

int milliSeconds = (int)((TimeSpan)(second - first)).TotalMilliseconds;
person Frank Bollack    schedule 28.09.2009
comment
Нет необходимости приводить тип к TimeSpan, а TotalMilliseconds — это двойное число. - person Henk Holterman; 28.09.2009
comment
Актерский состав не вредит производительности и делает намерение более ясным. Приведение возвращаемого значения к int также имеет смысл, так как оно все равно должно быть приведено, чтобы использовать его с таймером, как этого хочет OP. Кстати, код приведен в качестве примера, поэтому, если что-то не так и стоит проголосовать против, пожалуйста, уточните. - person Frank Bollack; 28.09.2009
comment
Нет приведения возвращаемого значения. Последняя строка не компилируется. - person Henk Holterman; 28.09.2009

VB.net, настольное приложение. Если вам нужно истекшее время в миллисекундах:

Dim starts As Integer = My.Computer.Clock.TickCount
Dim ends As Integer = My.Computer.Clock.TickCount
Dim lapsed As Integer = ends - starts
person Hannington Mambo    schedule 15.09.2017

person    schedule
comment
Пожалуйста, будьте осторожны с этим ответом. Использование «миллисекунд» вместо «TotalMilliseconds» дает разные результаты, первый просто дает миллисекундную составляющую временного промежутка, а второй дает общее время, выраженное в миллисекундах. - person Tomás Cot; 12.08.2017