.net - fecha - ¿Cómo puedo especificar la última hora del día con DateTime?
fecha y hora asp.net c# (10)
En base a las otras respuestas, creé 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);
}
}
Estoy usando 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 el tiempo después de que el selector de calendario ya haya almacenado la fecha como un objeto DateTime? Podría usar los AddHours, AddMinutes, AddSeconds
pero estos son relativos a la hora actual, que pueden no ser 00:00:00.
El startDate
deberá tener un tiempo de 00:00:00 y endDate
tener un tiempo de 23:59:59 para dar cuenta de los días completos.
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
Por ejemplo
DateTime.Now.Date.AddDays(1).AddSeconds(-1)
O AddTicks/AddMilliseconds/AddMinutes
... en función de la precisión que necesita.
Si ya tiene un objeto DateTime
creado y desea reemplazar la hora con las 11:59:59 PM de esa fecha determinada, puede usar la propiedad .Date
para obtener la fecha con el tiempo establecido en 00:00:00 y luego agregar las horas, minutos y segundos. Por ejemplo:
var dt = yourDateInstance.Date.AddHours(23).AddMinutes(59).AddSeconds(59);
Si por última vez, te refieres a 11:59:59 PM, entonces esto también debería funcionar:
var dt = new DateTime(Now.Year, Now.Month, Now.Day, 23, 59, 59);
Su pregunta ya ha sido respondida, pero en mi humilde opinión una mejor manera es no molestarse en tratar de restar un tic, un segundo o lo que sea desde el final del rango, y comparar usando estrictamente menos de.
De modo que si quieres todas las fechas en un rango inclusivo de startDate a endDate, ignorando la hora, podrías usar lo siguiente en C #:
if ((myDate >= startDate.Date) && (myDate < endDate.Date.AddDays(1)))
{
// ... it''s in the range
}
o en T-SQL, suponiendo que su @StartDate y @EndDate son exactamente la medianoche, algo así como:
WHERE SomeDate >= @StartDate AND SomeDate < DATEADD(d,1,@EndDate)
ACTUALIZAR
Ejemplo actualizado para mostrar un rango inclusivo en respuesta a los comentarios.
esto te 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
utilizar esta
DateTime YourNewDate = new DateTime (YourDate .Year, YourDate .Month, YourDate .Day, 23, 59, 59, 99);
yourDateInstance.CloseDate = yourDateInstance.CloseDate.Date.AddDays (1) .AddMilliseconds (-1);
DateTime d = DateTime.Today.AddDays(1).AddTicks(-1);
DateTime startDate = DateTime.Today;
DateTime stopDate = startDate.AddDays(1).AddTicks(-1);
Como nota, DateTime.Today
regresa (desde MSDN)
Un System.DateTime establecido en la fecha de hoy, con el componente de hora configurado en 00:00:00.
Entonces, como otros han notado, agregue un día, luego reste la menor cantidad de tiempo (un tic), y obtendrá la última hora posible para el día actual.
Por supuesto, es posible que tenga que pensar en TimeZones y eso 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.