2010-06-29 27 views
39

Estoy recuperando datos de un iSeries donde hay campos de fecha y hora separados. Quiero unirlos en un campo DateTime en mi proyecto C#. No veo una manera de agregar solo una hora al campo DateTime. ¿Cómo sugerirías lograr esto?Unir fecha y hora con DateTime en C#

Respuesta

44

¿Cómo se almacenan? Suponiendo que la parte de fecha se almacena como DateTime de la medianoche del día en cuestión y el tiempo es TimeSpan, puede simplemente agregarlos.

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

DateTime result = date + time; 
+0

Creo que este funcionará mejor para mí en este caso. ¡Gracias! –

+1

esto solo funcionará si la variable de fecha tiene una parte de tiempo 00:00:00, de lo contrario la variable de tiempo se agregará en la parte superior de la fecha y será un resultado inesperado. – batmaci

+2

@batmaci Sí, eso se establece específicamente en la respuesta. –

8

Puede construir fácilmente un TimeSpan desde su campo "tiempo".

Una vez que tenga que acaba de hacer:

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

Usted puede hacer esto con bastante facilidad:

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

TimeOfDay devuelve un TimeSpan, que luego se agrega a la fecha.

Editar (gracias a los comentaristas a continuación) - para estar seguro, utilice dateOnly.Date para asegurar la parte de la fecha solamente.

+4

Una palabra de precaución al espectador aquí donde debe asegurarse de que 'DateTime dateOnly' solo contenga una fecha diferente, con un TimeSpan suficientemente grande, cuando preformas el 'Agregar', ¡aumentarás el día en 1! – Coops

+3

@CodeBlend es correcto, esto me pasó a mí. La mejor manera de cubrirse es hacer: 'DateTime combined = dateOnly.Date.Add (timeOnly.TimeOfDay);' –

+2

¡Buena captura, @RodolfoDeLosSantos! Envié una solicitud para actualizar la solución para que coincida con su sugerencia. –

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

¿No puedes simplemente formatear la parte de la fecha y la parte del tiempo como cadenas separadas, y luego unirlas? A continuación, puede analizar la cadena de regreso a un objeto DateTime

+1

No muy eficiente. – Lazlo

0

Tenga en cuenta que agregar el tiempo a la fecha no es su mayor problema aquí. Tal como lo mencionó @Reed Copsey, solo crea un DateTime a partir de la fecha y luego .Add el tiempo.

Sin embargo, debe asegurarse de que la fecha y hora de iSeries (un tiempo Unix muy probablemente) estén en la misma representación que la representación .Net. Por lo tanto, lo más probable es que necesite convertirlo agregándolo a un DateTime el 1 de enero de 1970 también.

2

Puede agregar TimeSpan a DateTime y escribir algo como esto.

// 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

Esto debería hacer:

var output = date.Date + time.TimeOfDay; 

o

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

suponer que tanto la variable date y time son ambos del tipo DateTime