2010-07-09 12 views
5

Jak będę w stanie uzyskać datę czwartku w bieżącym tygodniu? Na przykład, w czwartek o tej bieżącego tygodnia jest 7/8/2010Znajdź konkretną datę w bieżącym tygodniu

+1

... chyba że system stanie rozważyć piątek być początek tygodnia, w którym to przypadku ten czwartek bieżącego tygodnia będzie 7/15/2010. Oczywiście bardzo mało prawdopodobne jest, że system uzna piątek za początek tygodnia, ale nie jest to prawdopodobnie poniedziałek na początku tygodnia. Być może będziesz musiał wziąć to pod uwagę, ponieważ otrzymasz inny wynik w niedzielę. –

+0

@Dr. W: Dobra uwaga; pytanie powinno określać, który dzień tygodnia jest uważany za rozpoczynający się. Zwykle jest niedziela, ale rozsądnie może być poniedziałek. –

+0

Właśnie powiedziano mi wcześniej, że we Włoszech poniedziałek uważany jest za początek tygodnia. –

Odpowiedz

16

Można to zrobić (alebit niezgrabnie) z istniejącym .NET DateTime. Sztuką jest użycie enum DayOfWeek jako liczby całkowitej - ponieważ oznacza dni Sun - Sat w porządku rosnącym numerycznym (0-6).

DateTime someDay = DateTime.Today; 
var daysTillThursday = (int)someDay.DayOfWeek - (int)DayOfWeek.Thursday; 
var thursday = someDay.AddDays(daysTillThursday); 

Albo jeszcze prościej:

var today = DateTime.Today; 
var thursday = today.AddDays(-(int)today.DayOfWeek).AddDays(4); 
+0

OK, przeprowadziłem test na 2 miliony iteracji, a mój algorytm zegary w 300ns i twój algorytm (druga część) zegary w 200ns. – ChaosPandion

+0

@ChaosPandion: Interesujące. Upewnij się, że w teście wydajności rozliczasz czas JIT, uruchamiając każdy przypadek testowy dwukrotnie i odrzucając wyniki pierwszego uruchomienia. W przeciwnym razie możesz zobaczyć wypaczone wyniki ... – LBushkin

+0

@LBushkin - Hmmm, spadłem tylko 1 bieg z testu. – ChaosPandion

2

Sprawdź tę bibliotekę: http://datetimeextensions.codeplex.com/

Z przykładów na stronie głównej:

DateTime nextFriday = DateTime.Now.Next(DayOfWeek.Friday); 
+1

PO szuka czwartku tego tygodnia, a nie następnego dnia. – Dolph

+0

+1 dla łącza do rozszerzeń DateTime – andyp

1
private static DateTime GetDayOfWeek(DayOfWeek dayOfWeek) 
{ 
    var date = DateTime.Now; 
    if (date.DayOfWeek != dayOfWeek) 
    { 
     var direction = date.DayOfWeek > dayOfWeek ? -1D : 1D; 
     do 
     { 
      date = date.AddDays(direction); 
     } while (date.DayOfWeek != dayOfWeek); 
    } 
    return date; 
} 
+0

Nie trzeba pętli, aby uzyskać odpowiedź. –

+2

@Steven - Wyślij odpowiedź, jeśli masz inny algorytm. – ChaosPandion

+0

Chciałbym, ale inni mnie do tego pobili. –

0

Pseudo kod do znalezienia najbliższy czwartek:

for 0 to 3 as x 
    if today + x days is Thursday 
     return (today + x days) 
    if today - x days is Thursday 
     return (today - x days) 

Pseudo kod znaleźć czwartek w tym tygodniu:

lookForward = true 
lookBackward = true 
FirstDayOfTheWeek = Sunday 

for 0 to 6 as x 
    if today + x days is FirstDayOfTheWeek 
     lookForward = false 
    if today - x days is FirstDayOfTheWeek 
     lookBackward = false 
    if lookForward and today + x days is Thursday 
     return (today + x days) 
    if lookBackward and today - x days is Thursday 
     return (today - x days) 

Niestety, nie znam C# :)

+1

Ładne ćwiczenia ... :) –

+0

Mam nadzieję, że przyda się komuś, szukając rozwiązania w innym języku. – Dolph

2
DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek).AddDays(4) 
+0

Zarówno ty, jak i LBushkin zarejestrowali tę odpowiedź w ciągu kilku sekund. Jednak dałem mu kredyt, ponieważ jego przykład był skuteczniejszy (tylko jedno połączenie z Today) i wyjaśnił to. –

+0

A jego odpowiedź da poprawny wynik w ciągu kilku milisekund północy, podczas gdy moja nie. – Curt

+0

Również prawdziwe. W rzeczywistości myślę, że można bezpiecznie generalizować, mówiąc, że jeśli zamierzasz używać bieżącego znacznika czasu więcej niż jeden raz w metodzie, powinieneś rozważyć jego buforowanie, aby upewnić się, że jesteś bezpieczny od warunków brzegowych. Jest również (nieco) szybszy. –

0
// This is fixed... 
int thursday = 4; 

int difference = thursday - (int)DateTime.Now.DayOfWeek; 

DateTime thursdayThisWeek = DateTime.Now.Date.AddDays(difference); 
Powiązane problemy