2010-07-29 12 views
32

Czy istnieje łatwy sposób uzyskania "i" "i" TimeMax "?DateTime.Now - pierwsza i ostatnia minuta dnia

+4

Masz na myśli 00: 00: 00.000 i 23: 59: 59.999? – Fosco

+1

Próbujesz przygotować swoje oprogramowanie, aby kiedyś można było go używać na Marsie? –

+0

Co oznaczają "TimeMin" i "TimeMax"? Dokładnie? – Oded

Odpowiedz

77

Oto dwa rozszerzenia, których używam do tego celu.

/// <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); 
    } 

Pozwala to napisać:

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

lub

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

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

AbsoluteStart można zastąpić DateTime.Now.Date –

+2

masz na myśli dateTime.Date? – hunter

+1

'DateTime.Now.AbsoluteStart()' jest zbędny, ponieważ byłby identyczny z 'DateTime.Today'. 'DateTime.Today' is" Obiekt, który jest ustawiony na dzisiejszą datę, z komponentem czasu ustawionym na 00:00:00. " - MSDN – Powerlord

7

spróbować

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

Jeśli używasz tego do filtrowania, jak komentarze sugerują, to to prawdopodobnie dobry pomysł na zapisanie DateTime Przejdź teraz do zmiennej, na wypadek gdyby data podziałała pomiędzy dwoma połączeniami. Bardzo mało prawdopodobne, ale nazwijmy to wystarczająco dużo razy i nieuchronnie stanie się to pewnego dnia (raczej noc).

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

To się zawsze stanie * dwa * dni, jak się okazuje. –

11

bym użyć następujących:

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

i używać < endOfDay zamiast <= endOfDay. Będzie to oznaczać, że zadziała niezależnie od tego, czy precyzja jest minutą, sekundą, milisekundą, kleszczem, czy czymś innym. Pozwoli to uniknąć błędów, takich jak the one we had on StackOverflow (chociaż porady były ignored).

Pamiętaj, że ważne jest, aby dzwonić tylko pod jeden numer DateTime.Now, jeśli chcesz rozpocząć i zakończyć tego samego dnia.

+0

Myślę, że chodzi o to, aby uzyskać datę w pierwszej i ostatniej chwili, nie zawsze do obliczeń, ale przede wszystkim do obliczeń – hunter

1

Podobnie jak inni oferenci, nie jestem do końca pewien, o co prosisz, ale chcesz uzyskać możliwie najdrobniejszy czas i czas (nie tylko w jeden dzień), a następnie DateTime.MinValue i DateTime.MaxValue, które zwracają 1/1/0001 12:00:00 AM i 12/31/9999 11:59:59 PM odpowiednio.

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

Jeden mały uszczypnąć do rozwiązania myśliwskiej nad ... używam następującą metodę rozszerzenia aby dostać się do końca dnia:

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); 
} 

ten powinien obsługiwać przypadki, w których DateTime jest albo DateTime.MinValue lub DateTime.MaxValue. Jeśli wywołasz AddDays (1) w DateTime.MaxValue, otrzymasz wyjątek. Podobnie wywołanie AddTicks (-1) na DateTime.MinValue spowoduje również zgłoszenie wyjątku.

1

Musisz być ostrożny, aby korzystać

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

po przejściu do procedury składowanej.

Może się zdarzyć, że wartość zostanie przybliżona do następnego dnia.

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

Niezbyt dokładna, ale rozwiązała moje problemy. Teraz możemy korzystać z AddMilliseconds, AddTicks i innych. Myślę, że będzie to zależało od tego, co zaspokoi Twoje potrzeby.

Powiązane problemy