2012-03-19 13 views
7

Tengo la teoría de por qué el siguiente código no está produciendo los resultados que necesita:¿Cuál es el método más fácil para eliminar la parte de un milisegundo de DateTime.UctNow.TimeOfDay?

endDate = DateTime.UtcNow.AddDays(1).ToShortDateString() + " " +  
     DateTime.UtcNow.TimeOfDay.Subtract(
     new TimeSpan(0, 0, 0, 0, DateTime.UtcNow.TimeOfDay.Milliseconds)); 

El procesador debe calcular el DateTime.UtcNow.TimeOfDay.Milliseconds, y debido a la duración del tiempo de una única señal de la CPU (y el tiempo para procesar esta propiedad y devolver un resultado), no denota que DateTime.UtcNow.TimeOfDay.Milliseconds restará la cantidad exacta de milisegundos especificado por el DateTime.UtcNow.TimeOfDay

lo que necesito saber, ¿cuál es el método más simple y más eficaz para eliminar la cantidad de milisegundos desde DateTime.UtcNow.TimeOfDay, sin tener que usar una gran cantidad de p tiempo rocessor? Esta aplicación mía es bastante grande, y este problema es bastante simple. Pero cuando se implementa esta aplicación, no hay espacio para que sea inestable. Este milisegundo debe recortarse porque se envía a un procedimiento almacenado en SQL Server, y este procedimiento almacenado específico no admite milisegundos en DateTimes. También me encuentro con este problema comúnmente, pero normalmente convierto la fecha en cadena (que es un molde por sí mismo), divido la cadena en el punto en milisegundos, y uso la posición de índice 0 para obtener el tiempo que necesito. ¿Hay una forma más corta y efectiva?

La estabilidad y la velocidad son las más importantes para mí.

Gracias de antemano

+0

¿No puedes simplemente hacer '_myDate.Milliseconds = 0;'? – Alxandr

+3

@Alxandr Las instancias 'DateTime' son inmutables, por lo que [' Milliseconds'] (http://msdn.microsoft.com/en-us/library/system.datetime.millisecond.aspx) no tiene propiedad establecida. –

+0

¿Por qué dividirse cuando puede especificar el formato de cadena sin milisegundos, podría analizarlo de nuevo en 'DateTime' – V4Vendetta

Respuesta

8

Todo lo que necesita saber acerca de la personalización de la DateTime ToString format is here on MSDN.

En términos simples, algo como esto:

endDate = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd hh:mm:ss"); 

(altera el formato que se desee)

+0

¿Por qué no pensé en eso el mes pasado – Eon

+1

También llamado * Brain-fade * - Nos sucede a todos :) –

7

No use repetidamente la propiedad Now/UtcNow en la misma expresión. Obtener el valor de una vez, y utilizar el mismo valor en los diferentes lugares:

DateTime now = DateTime.Now; 
endDate = now.AddDays(1).ToShortDateString() + " " +  
    now.TimeOfDay.Subtract(
    new TimeSpan(0, 0, 0, 0, now.TimeOfDay.Milliseconds)); 

Si sólo desea que la fecha formateada de una manera especial, y no es necesario que el valor real DateTime, puede saltarse los milisegundos en el formato, por ejemplo:

endDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); 

como se va a enviar el valor de la base de datos, no debe enviarlo como una cadena, sino como un valor DateTime:

DateTime now = DateTime.Now; 
DateTime endDate = now - new TimeSpan(0, 0, 0, 0, now.TimeOfDay.Milliseconds); 
+0

el problema es que es un procedimiento almacenado que quiere el valor como un valor varchar, aunque es un fecha. Estoy obligado a enviarlo realmente como una cadena. Tendré en cuenta su publicación cuando trabaje con Datetimes en bases de datos. – Eon

+1

¿Por qué el voto a favor? Si no explica qué es lo que cree que está mal, no puede mejorar la respuesta. – Guffa

-1

Use C# DateTime formatting como se describe muy bien en MSDN. Su análisis en el cálculo en milisegundos es muy posiblemente erróneo. También para la concatenación de cadenas use un StringBuilder

+0

No habría ningún beneficio al usar un StringBuilder aquí; es una expresión única, por lo que sería una llamada a String.Concat. –

4

Básicamente, cree una nueva instancia de DateTime a partir de una existente, pero configure todo como "más pequeño" y luego milisegundos a cero. Se puede utilizar un método de extensiones:

public static class DateTimeExtensions 
{ 
    public static DateTime ZeroMilliseconds(this DateTime dt) 
    { 
     return new DateTime(((dt.Ticks/10000000) * 10000000), dt.Kind); 
    } 
} 

O para un ejemplo completo utilizando su código:

var now = DateTime.Now; 
endDate = now.AddDays(1).ToShortDateString() + " " + now.ZeroMilliseconds().TimeOfDay; 
2

Si desea eliminar milisegundos sin tener ningún problema en las garrapatas.

DateTime d = DateTime.Now; 
var newDate = new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second); 
+0

¡Gracias funcionó para mí! –

Cuestiones relacionadas