2009-09-28 15 views
31

Ho due controlli TextBox mascherati e mi chiedevo come fare per ottenere il tempo in ciascuno e quindi convertire la differenza in millisecondi. Ad esempio, in tb1 scrivo "12:01" e in tb2 scrivo "12:02", quindi fai clic su un pulsante. Dopo aver fatto clic sul pulsante, viene avviato un timer e alle 12:02 viene visualizzata una finestra di messaggio. So come fare tutto tranne la parte di conversione del tempo.Converti Differenza tra 2 volte in Millisecondi?

Come può essere raggiunto?

+1

La tua domanda non è chiara. Non sai come ottenere la differenza tra due DateTime o come convertire "12:01" in DateTime? –

risposta

82
DateTime dt1 = DateTime.Parse(maskedTextBox1.Text); 
DateTime dt2 = DateTime.Parse(maskedTextBox2.Text); 
TimeSpan span = dt2 - dt1; 
int ms = (int)span.TotalMilliseconds; 
10

Per rispondere il titolo-domanda:

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

int millisceonds = (int) diff.TotalMilliseconds; 

è possibile utilizzare questo per impostare un timer:

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

Non dimenticare di disattivare il timer quando si maneggia il segno di spunta.

Ma se si vuole un evento a 00:03, basta sostituire DateTime.Now per d1.

Ma non è chiaro quale sia l'esatta funzione di textBox1 e textBox2.

+1

È necessario utilizzare TotalMilliseconds, non Milliseconds. – MusiGenesis

+1

È necessario "TotalMilliseconds" non "Millisecondi" I millisecondi ti forniscono solo il "resto" millisecondo della differenza di orario, non l'intero intervallo di tempo. 2.475 secondi dà Millisecondi = 475, TotalMilliseconds = 2475 – StarPacker

+0

Sì, corretto. Darn interfaccia TimeSpan. –

5

dovete convertire i valori di casella di testo per DateTime (t1, t2), quindi:

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

Oppure utilizzare DateTime.TryParse (TextBox1, fuori t1); La gestione degli errori dipende da voi.

+0

Scrittura dalla memoria del cervello :))) –

+1

Hai avuto ragione la prima volta: devi utilizzare TotalMilliseconds (a meno che non ti piaccia restituire 0 ogni volta). – MusiGenesis

0

Prova:

DateTime first; 
DateTime second; 

int milliSeconds = (int)((TimeSpan)(second - first)).TotalMilliseconds; 
+0

Non è necessario digitare cast a TimeSpan e TotalMilliseconds è un doppio. –

+0

Il cast non danneggia le prestazioni e rende più chiara l'intenzione. Anche il cast del valore restituito a int ha senso, poiché deve essere comunque castato per usarlo con il timer, come vuole l'OP. A proposito, il codice è da intendersi come esempio, quindi se c'è qualcosa di sbagliato e vale la pena di votarlo, per favore, elabora. –

+0

Non c'è cast del valore di ritorno. L'ultima riga non verrà compilata. –

0

Prova il seguente:

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

Se si desidera solo per visualizzare una finestra di messaggio alle 12:02, utilizzare un controllo timer con ritardo di, diciamo, 250 ms, continua a controllare se l'ora corrente è 12:02. Quando lo è, visualizza il messaggio e ferma il timer. Nota che questo non richiede un campo per l'ora di inizio (anche se potresti usarlo per qualcos'altro - non so - nel qual caso sarà utile l'altro codice fornito qui).

1

Se si ha a che fare solo con Times e nessuna data si vorrà trattare solo con TimeSpan e gestire l'attraversamento oltre la mezzanotte.

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; 
0
var firstTime = DateTime.Now; 
var secondTime = DateTime.Now.AddMilliseconds(600); 
var diff = secondTime.Subtract(firstTime).Milliseconds; 


// var diff = DateTime.Now.AddMilliseconds(600).Subtract(DateTime.Now).Milliseconds; 
+0

Si prega di fare attenzione con questa risposta. L'uso di'Millisecondi 'invece di'TotalMilliseconds' dà risultati diversi, il primo fornisce solo il componente dei millisecondi dell'intervallo di tempo e l'ultimo dà il tempo totale espresso in millisecondi. –

4

Molte delle soluzioni di cui sopra potrebbero ideale persone diverse.
Vorrei suggerire un codice leggermente modificato rispetto alla soluzione più accettata da "MusiGenesis".

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

Considerazioni:
- earlierTime.Subtract(laterTime) si otterrà un valore negativo.
- utilizzare int milDiff = (int)DateTime.Now.Subtract(StartTime).TotalMilliseconds; se avete bisogno di valore intero, invece di doppia
- Lo stesso codice può essere utilizzato per ottenere differenza tra due valori di data e si possono ottenere .TotalDays o .TotalHours insteaf di .TotalMilliseconds

0
public static Int64 GetDifferencesBetweenTwoDate(DateTime newDate, DateTime oldDate, string type) 
    { 
     var span = newDate - oldDate; 
     switch (type) 
     { 
      case "tt": return (int)span.Ticks; 
      case "ms": return (int)span.TotalMilliseconds; 
      case "ss": return (int)span.TotalSeconds; 
      case "mm": return (int)span.TotalMinutes; 
      case "hh": return (int)span.TotalHours; 
      case "dd": return (int)span.TotalDays; 
     } 
     return 0; 
    } 
0

VB.net, Applicazione desktop Se hai bisogno di tempo scaduto in millisecondi:

Dim starts As Integer = My.Computer.Clock.TickCount 
Dim ends As Integer = My.Computer.Clock.TickCount 
Dim lapsed As Integer = ends - starts