Estoy tratando de comparar una marca de tiempo de una solicitud entrante a un valor almacenado de la base de datos. SQL Server, por supuesto, mantiene cierta precisión de milisegundos en el tiempo, y cuando se lee en un .NET DateTime, incluye esos milisegundos. Sin embargo, la solicitud entrante al sistema no ofrece esa precisión, por lo que simplemente necesito soltar los milisegundos.
Siento que me falta algo obvio, pero no he encontrado una manera elegante de hacerlo (C #).
string
representación formateada de aDateTime
, tal vez sea necesaria una edición para dejar en claro que "truncar" / "drop" milisegundos medios "producen unDateTime
valor en el que todos los componentes de fecha / hora son los mismos exceptoTimeOfDay.TotalMilliseconds
es0
". La gente no lee, por supuesto, sino solo para eliminar cualquier ambigüedad.Respuestas:
Lo siguiente funcionará para un DateTime que tiene milisegundos fraccionales y también conserva la propiedad Kind (Local, Utc o Undefined).
o el equivalente y más corto:
Esto podría generalizarse en un método de extensión:
que se usa de la siguiente manera:
fuente
fuente
Aquí hay un método de extensión basado en una respuesta anterior que le permitirá truncar a cualquier resolución ...
Uso:
Clase:
fuente
fuente
Millisecond
propiedad proporciona un número entero entre 0 y 999 (inclusive). Entonces, si la hora del día anterior a la operación fue, digamos,23:48:49.1234567
entonces ese número entero será123
, y la hora del día después de la operación es23:48:49.0004567
. Por lo tanto, no se ha truncado a un número entero de segundos.A veces desea truncar a algo basado en el calendario, como año o mes. Aquí hay un método de extensión que le permite elegir cualquier resolución.
fuente
En lugar de soltar los milisegundos y luego comparar, ¿por qué no comparar la diferencia?
o
fuente
Menos obvio pero más de 2 veces más rápido:
fuente
d.AddMilliseconds(-d.Millisecond)
no necesariamente mueve el DateTime exactamente al segundo completo anterior.d.Ticks % TimeSpan.TicksPerMillisecond
las garrapatas (entre 0 y 9,999) más allá de su segundo permanecerán.Para redondear a la segunda:
Reemplace con
TicksPerMinute
para redondear al minuto.Si su código es sensible al rendimiento, tenga cuidado con
Mi aplicación estaba gastando el 12% del tiempo de CPU en System.DateTime.GetDatePart .
fuente
Una forma de lectura fácil es ...
Y más...
fuente
var now = DateTime.Parse(DateTime.Now.ToString())
funciona bien.Respecto a la respuesta de Diadistis. Esto funcionó para mí, excepto que tuve que usar Floor para eliminar la parte fraccional de la división antes de la multiplicación. Entonces,
se convierte
Hubiera esperado que la división de dos valores Long produjera un Long, eliminando así la parte decimal, pero lo resuelve como un Doble dejando exactamente el mismo valor después de la multiplicación.
Eppsia
fuente
2 Métodos de extensión para las soluciones mencionadas anteriormente
uso:
fuente
No es la solución más rápida pero simple y fácil de entender:
fuente
Y por uso de
:PAGS
fuente
string
vez de unaDateTime
, pero esto omite componentes de tiempo de la salida por completo . (Eso también hace que el acceso a laToday
propiedad sea innecesario.)Nuevo método
// define el parámetro de paso de cadena dd-mmm-aaaa retorno 24-feb-2016
O se muestra en el cuadro de texto
// poner PageonLoad
fuente
string
vez de unaDateTime
, pero esto omite componentes de tiempo de la salida por completo . (Eso también hace que el acceso a laToday
propiedad sea innecesario.)En mi caso, tenía el objetivo de salvar TimeSpan de la herramienta datetimePicker sin guardar los segundos y los milisegundos, y aquí está la solución.
Primero convierta el datetimePicker.value a su formato deseado, el mío es "HH: mm" y luego vuelva a convertirlo a TimeSpan.
fuente
string
) para hacer esto seríaDateTime datetime = datetimepicker1.Value; TimeSpan timeSpan = new TimeSpan(datetime.Hour, datetime.Minute, 0);
O podría usar una variación del método de extensión de Joe que funciona conTimeSpan
valores y usarTimeSpan timeSpan = datetime.TimeOfDay.Truncate(TimeSpan.FromSeconds(1));
para truncar segundos.Esta es mi versión de los métodos de extensión publicados aquí y en preguntas similares. Esto valida el valor de los ticks de una manera fácil de leer y conserva el DateTimeKind de la instancia original de DateTime. (Esto tiene efectos secundarios sutiles pero relevantes cuando se almacena en una base de datos como MongoDB).
Si el verdadero objetivo es truncar un DateTime a un valor específico (es decir, horas / minutos / segundos / MS), recomiendo implementar este método de extensión en su código. Asegura que solo puede truncar con una precisión válida y conserva los metadatos importantes DateTimeKind de su instancia original:
Entonces puedes usar el método de esta manera:
fuente
Sé que la respuesta es bastante tardía, pero la mejor manera de deshacerse de milisegundos es
Intente imprimir el valor de la variable, mostrará la fecha y hora, sin milisegundos.
fuente