2009-05-04 14 views
51

Estoy utilizando un objeto System.DateTime para permitir que un usuario seleccione un rango de fechas. El usuario solo puede seleccionar una fecha (no la hora) usando un calendario de terceros, así que tendré que especificar automáticamente la hora del día que debería usar (es decir: 00:00:00 o 23:59:59) después de la fecha esta elegido.Cómo puedo especificar la última hora del día con DateTime

¿Cómo puedo especificar el tiempo después de que el selector de calendario ya haya almacenado la fecha como un objeto DateTime? Podría usar los métodos AddHours, AddMinutes, AddSeconds pero esos son relativos a la hora actual que pueden no ser 00:00:00.

El startDate necesitará tener un tiempo de 00:00:00 y endDate tienen un tiempo de 23:59:59 para dar cuenta de los días completos.

+0

La hora límite de ser el día 23: 59: 59.999? – Eppz

+0

¿Qué quiere decir con "última hora del día"? –

+0

Tan preciso como lo manejará (pero en realidad, los segundos deberían ser muy buenos) –

Respuesta

66

Si ya tiene un objeto DateTime creado y desea reemplazar la hora con las 11:59:59 PM de esa fecha, puede usar la propiedad .Date para obtener la fecha con el tiempo establecido en 00:00:00 y luego agregue las horas, minutos y segundos. Por ejemplo:

var dt = yourDateInstance.Date.AddHours(23).AddMinutes(59).AddSeconds(59); 

Si por última vez, quiere decir 11:59:59 PM, entonces esto también debería funcionar:

var dt = new DateTime(Now.Year, Now.Month, Now.Day, 23, 59, 59); 
+0

De hecho. No hay nada que diga que debe usar Now.XXX para generar un año, mes, día, hora, minuto o segundo. Puede hacer un DateTime que represente cualquier instancia de tiempo determinada. –

+0

¿Qué sucede si no estoy del todo seguro si ya está configurado en 00:00:00? ¿Puedo establecerlo directamente en un tiempo en lugar de que sea relativo? –

+1

Sí, la propiedad. Fecha devuelve el componente de fecha con el tiempo establecido en 00:00:00. Es por eso que el código dice: youDateInstance.Date antes de agregar las horas. –

60

Para obtener el último instante para hoy:

DateTime d = new DateTime(Now.Year, Now.Month, Now.Day); 
d = d.AddDays(1); 
d = d.AddTicks(-1); 

En respuesta a su edición, esto es lo que haría:

DateTime start = new DateTime(Now.Year, Now.Month, Now.Day); 
DateTime end = start.AddDays(1).AddTicks(-1); 

// Or - just use end = start.AddDays(1), and use a < for comparison 
+0

+1. Estaba pensando exactamente lo mismo. ¿Todos tienen algún tipo de teclado especial con SO-intellisense/autocompletar integrado? –

+0

AddDays (1) lo configurará a las 00:00:00 del día siguiente, ¿luego? –

+0

@ d03boy: exactamente. AddDays() será exactamente 24 horas después. En este caso, a las 00: 00: 00.0. Si quieres el mismo instante antes de eso, resta un tic. –

15
DateTime d = DateTime.Today.AddDays(1).AddTicks(-1); 
6
DateTime startDate = DateTime.Today; 
DateTime stopDate = startDate.AddDays(1).AddTicks(-1); 

Como nota, DateTime.Today rendimientos (de MSDN)

Un System.DateTime establecen en la fecha de hoy, con el componente de tiempo establecido para 00:00:00.

Como lo han notado otros, agregue un día, restar el tiempo más pequeño (un tilde), y obtendrá la última hora posible para el día actual.

Por supuesto, puede que tenga que pensar en TimeZones y tal dependiendo de dónde se ejecuta el código frente a dónde está el usuario. La hora UTC puede ser buena, pero eso puede demorar un día (de cualquier manera) dependiendo de dónde se ejecuta el código.

+0

Me alegro de que pienses en las zonas horarias. de. –

9

Su pregunta ya ha sido respondida, pero en mi humilde opinión una mejor manera es no molestarse en intentar restar un tic, un segundo, o lo que sea desde el final del rango, y comparar usando estrictamente menos de.

Así que si desea que todas las fechas en un incluido gama de startDate a endDate, ignorando el tiempo, se puede usar el siguiente en C#:

if ((myDate >= startDate.Date) && (myDate < endDate.Date.AddDays(1))) 
{ 
    // ... it's in the range 
} 

o en T-SQL, asumiendo que su @ StartDate y @EndDate son exactamente la medianoche, algo así como:

WHERE SomeDate >= @StartDate AND SomeDate < DATEADD(d,1,@EndDate) 

ACTUALIZACIÓN

Ejemplo actualizado para mostrar un rango inclusivo en respuesta a los comentarios.

+0

IMO, endDate aún debe incluirse en la búsqueda. ¿Qué ocurre si elijo el 2 de junio y el 2 de junio como fechas de inicio y finalización? –

+0

Luego puede agregar un día a endDate y usar el código de Joe ;-) –

0

uso esta

DateTime YourNewDate = new DateTime (YourDate .Año, YourDate .Month, YourDate .Día, 23, 59, 59, 99);

+0

¿Puedes explicar un poco más? –

+0

Esto es realmente lo mismo que la segunda parte de la respuesta aceptada. –

0

yourDateInstance.CloseDate = yourDateInstance.CloseDate.Date.AddDays (1) .AddMilliseconds (-1);

1

Por ejemplo

DateTime.Now.Date.AddDays(1).AddSeconds(-1) 

O AddTicks/AddMilliseconds/AddMinutes ... basada en la precisión que necesita.

0

Sobre la base de las otras respuestas que he creado este conveniente método de extensión:

public static class DateTimeExtensions 
{ 
    public static DateTime EndOfDay(this DateTime dateTime) 
    { 
     return dateTime.Date.AddDays(1).AddTicks(-1); 
    } 
} 
0

esto le dará el resultado esperado:

DateTime startDate= DateTime.Now.Date; 
DateTime endDate= startDate.AddDays(2).Add(new TimeSpan(23, 59, 59)); 
//startDate: 28/9/2017 0:0:0 endDate: 29/9/2017 23:59:59 
Cuestiones relacionadas