2010-07-29 28 views
32

¿Hay alguna manera fácil de obtener DateTime.Now 'TimeMin' y 'TimeMax'?DateTime.Now - primer y último minuto del día

+4

¿Quiere decir 00: 00: 00,000 y 23: 59: 59.999? – Fosco

+1

¿Está tratando de preparar su software para que pueda ser utilizado en Marte algún día? –

+0

¿Qué significa "TimeMin" y "TimeMax"? ¿Exactamente? – Oded

Respuesta

77

Aquí hay dos extensiones que utilizo para hacer exactamente eso.

/// <summary> 
    /// Gets the 12:00:00 instance of a DateTime 
    /// </summary> 
    public static DateTime AbsoluteStart(this DateTime dateTime) 
    { 
     return dateTime.Date; 
    } 

    /// <summary> 
    /// Gets the 11:59:59 instance of a DateTime 
    /// </summary> 
    public static DateTime AbsoluteEnd(this DateTime dateTime) 
    { 
     return AbsoluteStart(dateTime).AddDays(1).AddTicks(-1); 
    } 

Esto le permite escribir:

DateTime.Now.AbsoluteEnd() || DateTime.Now.AbsoluteStart() 

o

DateTime partyTime = new DateTime(1999, 12, 31); 

Console.WriteLine("Start := " + partyTime.AbsoluteStart().ToString()); 
Console.WriteLine("End := " + partyTime.AbsoluteEnd().ToString()); 
+0

AbsoluteStart se puede relacionar con DateTime.Now.Date –

+2

¿Quiere decir dateTime.Date? – hunter

+1

'DateTime.Now.AbsoluteStart()' es redundante, ya que sería idéntico a 'DateTime.Today'. 'DateTime.Today' es" Un objeto que se establece en la fecha de hoy, con el componente de hora configurado en 00:00:00 ". - MSDN – Powerlord

7

tratar

//midnight this morning 
DateTime timeMin = DateTime.Now.Date; 
//one tick before midnight tonight 
DateTime timeMax = DateTime.Now.Date.AddDays(1).AddTicks(-1) 

Si está usando este para el filtrado, como sus comentarios sugieren, se es probablemente una buena idea para guardar DateTime . Ahora en una variable, solo en caso de que la fecha coincida entre las dos llamadas. Muy poco probable, pero llámalo bastantes veces y, inevitablemente, sucederá un día (más bien la noche).

DateTime currentDateTime = DateTime.Now; 
DateTime timeMin = currentDateTime.Date; 
DateTime timeMax = currentDateTime.Date.AddDays(1).AddTicks(-1) 
+2

Ocurrirá invariablemente * dos * días, como se verá después. –

11

que haría uso de lo siguiente:

DateTime now = DateTime.Now; 
DateTime startOfDay = now.Date; 
DateTime endOfDay = startOfDay.AddDays(1); 

y utilizar < endOfDay en lugar de <= endOfDay. Esto significa que funcionará independientemente de si la precisión es de minutos, segundos, milisegundos, tics u otra cosa. Esto evitará errores como the one we had on StackOverflow (aunque el consejo fue ignored).

Tenga en cuenta que es importante llamar solo al DateTime.Now una vez si desea comenzar y finalizar el mismo día.

+0

Creo que el objetivo es obtener una fecha en su primer y último momento, no siempre para el cálculo, sino principalmente para el cálculo – hunter

1

Al igual que otros que responden, no estoy muy seguro de lo que estás pidiendo, pero en caso que usted quiera el menor tiempo posible y el mayor tiempo posible, (no sólo en un día), entonces no hay DateTime.MinValue y DateTime.MaxValue que devuelven 1/1/0001 12:00:00 AM y 31/12/9999 11:59:59 PM respectivamente.

1

Yo aconsejaría que nos fijamos en esta respuesta: How can I specify the latest time of day with DateTime

Si sus DateTime originales también, potencialmente, incluyen veces, utilizando los AddDays() método se sumará un total de 24 horas, lo cual puede no ser precisamente lo que quiere .

1
public static DateTime ToEndOfDay(this DateTime time) 
    { 
     var endOfDaySpan = TimeSpan.FromDays(1).Subtract(TimeSpan.FromMilliseconds(1)); 
     return time.Date.Add(endOfDaySpan); 
    } 
2

Un pequeño pellizco a la solución del cazador por encima de ... utilizo el siguiente método de extensión para llegar al final del día:

public static DateTime EndOfDay(this DateTime input) { 
    return input.Date == DateTime.MinValue.Date ? input.Date.AddDays(1).AddTicks(-1) : input.Date.AddTicks(-1).AddDays(1); 
} 

Esto debe manejar casos en que el DateTime es bien DateTime.MinValue o DateTime.MaxValue. Si llama a AddDays (1) en DateTime.MaxValue, obtendrá una excepción. Del mismo modo, al llamar AddTicks (-1) en DateTime.MinValue también se lanzará una excepción.

1

Usted debe tener cuidado de usar

(new DateTime()).AddDays(1).AddTicks(-1); 

cuando se pasa al procedimiento almacenado.

Puede ocurrir que el valor se aproxime al día siguiente.

0
DateTime.Today.AddDays(1).AddSeconds(-1); 

No es muy exacto, pero solucionó mis problemas. Ahora podemos usar AddMilliseconds, AddTicks y etc. Creo que variará según lo que satisfaga su necesidad.

Cuestiones relacionadas