2010-06-29 14 views
39

Sto recuperando i dati da un iSeries in cui sono presenti campi separati di data e ora. Voglio unirmi a loro in un campo DateTime nel mio progetto C#. Non vedo un modo per aggiungere solo un tempo a un campo DateTime. Come suggeriresti di realizzare questo?Registrazione data e ora Data e ora C#

risposta

44

Come vengono memorizzati? Supponendo che la parte della data venga archiviata come DateTime della mezzanotte del giorno in questione e che l'ora sia TimeSpan, è sufficiente aggiungerli.

DateTime date = ...; 
TimeSpan time = ...; 

DateTime result = date + time; 
+0

Penso che questo funzionerà meglio per me in questo caso. Grazie! –

+1

funziona solo se la variabile data ha la parte temporale 00:00:00 altrimenti la variabile temporale verrà aggiunta in cima alla data e sarà un risultato imprevisto. – batmaci

+2

@batmaci Sì, questo è espressamente indicato nella risposta. –

8

È possibile costruire facilmente un TimeSpan dal campo "Ora".

Una volta che avete, basta fare:

TimeSpan time = GetTimeFieldData(); 
dateField = dateField.Add(time); 
67

È possibile farlo abbastanza facilmente:

DateTime dateOnly; 
DateTime timeOnly; 
... 
DateTime combined = dateOnly.Date.Add(timeOnly.TimeOfDay); 

TimeOfDay restituisce una TimeSpan, che poi si aggiungono alla data.

Modifica (grazie ai commentatori di seguito) - per sicurezza, utilizzare dateOnly.Date per garantire solo la parte di data.

+4

Una parola di cautela per lo spettatore qui che devi assicurarti che 'DateTime dateOnly' contenga solo una data altrimenti, con un TimeSpan abbastanza grande, quando preformi il comando 'Aggiungi', aumenterai il giorno di 1! – Coops

+3

@CodeBlend è corretto, questo è successo a me. Il modo migliore per coprirsi è: 'DateTime combined = dateOnly.Date.Add (timeOnly.TimeOfDay);' –

+2

Good catch, @RodolfoDeLosSantos! Ho inviato una richiesta per aggiornare la soluzione in modo che corrisponda al tuo suggerimento. –

4
Datetime date = new DateTime(Date1.Year, Date1.Month, Date1.Day, Time1.Hour, Time1.Minute, Time1.Second); 
-2

Non puoi semplicemente formattare la parte di data e ora come stringhe separate, quindi unirle insieme? Quindi è possibile analizzare la stringa su un oggetto DateTime

+1

Non molto efficiente. – Lazlo

0

Si noti che aggiungere il tempo alla data non è il problema più grande qui. Come menzionato @Reed Copsey, devi solo creare un DateTime dalla data e quindi .Add l'ora.

Tuttavia, è necessario assicurarsi che la data e l'ora di iSeries (un tempo Unix molto probabilmente) siano nella stessa rappresentazione della rappresentazione .Net. Quindi, probabilmente hai bisogno di convertirlo aggiungendolo ad un DateTime del 1 ° gennaio 1970.

2

È possibile aggiungere un TimeSpan a un DateTime e scrivere qualcosa come questo.

// inside consuming function 
ISeriesObject obj = getMyObject(); 
DateTime dt = getDate(obj) + getTime(obj); 

private DateTime getDate(ISeriesObject obj) 
{ 
    //return a DateTime 
} 


private TimeSpan getTime(ISeriesObject obj) 
{ 
    //return a TimeSpan 
} 
2

Questo dovrebbe fare:

var output = date.Date + time.TimeOfDay; 

o

var output = new DateTime(date.Year, date.Month, date.Day, 
          time.Hour, time.Minute, time.Second); 

supporre che sia variabile date e time sono entrambi di tipo DateTime