2010-07-09 23 views
5

¿Cómo podría obtener la fecha del jueves de la semana en curso? Por ejemplo, el jueves de esta semana actual es 7/8/2010Buscar fecha específica en la semana actual

+1

... a menos que el sistema pasa a considerar el viernes para ser el inicio de la semana, en cuyo caso jueves de esta semana en curso habría 7/15/2010. Por supuesto, es muy poco probable que un sistema considere que el viernes sea el comienzo de la semana, pero no es improbable que el lunes sea el comienzo de la semana. Es posible que deba considerar eso, ya que obtendría un resultado diferente el domingo. –

+0

@Dr. W: Buen punto; la pregunta debe definir qué día se considera que la semana comienza. Por lo general, es domingo, pero podría ser razonablemente el lunes. –

+0

Me acaban de informar que hoy en Italia se considera que el lunes es el comienzo de la semana. –

Respuesta

16

Usted puede hacer esto (alebit torpemente) con el .NET DateTime existente. El truco es usar la enumeración DayOfWeek como un número entero, ya que denota los días Sol - Sáb en orden numérico ascendente (0-6).

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

O aún más simple:

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

OK, ejecuté una prueba para 2 millones de iteraciones y mi algoritmo alcanza 300ns y su algoritmo (segunda parte) alcanza los 200ns. – ChaosPandion

+0

@ ChaosPandion: Interesante. Asegúrese de que en su prueba de rendimiento cuente el tiempo JIT ejecutando cada caso de prueba dos veces y descartando los resultados de la primera ejecución. De lo contrario, puede ver resultados sesgados ... – LBushkin

+0

@LBushkin - Hmmm, solo bajé 1 carrera de la prueba. – ChaosPandion

2

Salida esta biblioteca: http://datetimeextensions.codeplex.com/

partir de los ejemplos en la página principal:

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

El OP está buscando el jueves de esta semana, no la próxima vez que ese día llegue. – Dolph

+0

+1 para el enlace a las extensiones 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

No necesita hacer un bucle para obtener la respuesta. –

+2

@Steven - No dude en publicar una respuesta si tiene un algoritmo diferente. – ChaosPandion

+0

Lo haría, pero otros me han vencido. –

0

Pseudo código para encontrar más cercana Jueves:

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 código para encontrar el jueves de esta semana:

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) 

Lo sentimos, no hablo C# :)

+1

Buen ejercicio ... :) –

+0

Afortunadamente, será útil para otra persona que busque una solución en otro idioma. – Dolph

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

Tanto usted como LBushkin registraron esta respuesta en cuestión de segundos el uno del otro. Sin embargo, le di crédito porque su ejemplo fue más eficiente (solo una llamada a Today) y él lo explicó. –

+0

Y su respuesta dará el resultado correcto dentro de unos pocos milisegundos de la medianoche, mientras que la mía no lo hará. – Curt

+0

También es cierto. De hecho, creo que es seguro generalizar diciendo que, si tiene la intención de utilizar la marca de tiempo actual más de una vez en un método, debería considerar almacenarla en caché para asegurarse de que está a salvo de las condiciones límite. También es (ligeramente) más rápido. –

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

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

DateTime thursdayThisWeek = DateTime.Now.Date.AddDays(difference); 
Cuestiones relacionadas