Ir al contenido


Foto

Días de una semana dada


  • Por favor identifícate para responder
19 respuestas en este tema

#1 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 enero 2014 - 09:43

Hola amigos, a ver si me puedo explicar :D

Resulta que necesito encontrar los días correspondientes a una semana dada, es decir en el año tenemos 52 semanas, pero necesito saber que días contiene, por ejemplo, si busco en cualquier calendario de 2014 veo que la Semana 22 inicia el 26 mayo y termina el 1° junio.

El problema es que necesito saber en base al año y número de semana cuales días contiene, estoy soñando algo como ésto:



delphi
  1. function getDias(const anio,semana: integer):TStringList;



¿ alguna idea de como obtener dichos días ?

Saludos y gracias

  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 22 enero 2014 - 09:49

y no es siempre 7 dias? o hay semanas cortas y semanas santas?? jejeje
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 enero 2014 - 09:59

y no es siempre 7 dias? o hay semanas cortas y semanas santas?? jejeje


pues...... tieners razón, no había pensado en eso :D

No wey, quiero saber Qué días no Cuantos días :p  8o| (li) :s *-) :D

Saludos
  • 0

#4 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 22 enero 2014 - 10:10

Disculpa sigo sin entender, si ejecutas esto:

function getDias(2014, 3):TStringList;

que esperas obtener?
  • 0

#5 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 22 enero 2014 - 10:24

...Resulta que necesito encontrar los días correspondientes a una semana dada, es decir en el año tenemos 52 semanas, pero necesito saber que días contiene, por ejemplo, si busco en cualquier calendario de 2014 veo que la Semana 22 inicia el 26 mayo y termina el 1° junio.

El problema es que necesito saber en base al año y número de semana cuales días contiene, estoy soñando algo como ésto:



delphi
  1. function getDias(const anio,semana: integer):TStringList;

...


Delphi tiene una función StartOfMonth() que te devuelve el día en que inicia el mes. También una función WeekOfYear la cual se basa en el día para darte la semana..., ¿algo más que se me olvide?
  • 0

#6 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 22 enero 2014 - 10:32

Disculpa sigo sin entender, si ejecutas esto:

function getDias(2014, 3):TStringList;

que esperas obtener?


Se esperaría obtener un TStringList que contenga:

12/Enero/2014
13/Enero/2014
14/Enero/2014
15/Enero/2014
16/Enero/2014
17/Enero/2014
18/Enero/2014


Que corresponden a los días que pertenecen a la semana 3 del 2014...

Saludox ! :)
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 enero 2014 - 10:56


...Resulta que necesito encontrar los días correspondientes a una semana dada, es decir en el año tenemos 52 semanas, pero necesito saber que días contiene, por ejemplo, si busco en cualquier calendario de 2014 veo que la Semana 22 inicia el 26 mayo y termina el 1° junio.

El problema es que necesito saber en base al año y número de semana cuales días contiene, estoy soñando algo como ésto:



delphi
  1. function getDias(const anio,semana: integer):TStringList;

...


Delphi tiene una función StartOfMonth() que te devuelve el día en que inicia el mes. También una función WeekOfYear la cual se basa en el día para darte la semana..., ¿algo más que se me olvide?


Gracias Felipe, el punto es que el número de la semana y el año ya los tengo, lo que necesito es saber que días son los que corresponden a la semana dada.


Disculpa sigo sin entender, si ejecutas esto:

function getDias(2014, 3):TStringList;

que esperas obtener?


Se esperaría obtener un TStringList que contenga:

12/Enero/2014
13/Enero/2014
14/Enero/2014
15/Enero/2014
16/Enero/2014
17/Enero/2014
18/Enero/2014


Que corresponden a los días que pertenecen a la semana 3 del 2014...

Saludox ! :)


Efectivamente; tal como lo dices es como necesito obtener los días de la semana.

Saludos :)
  • 0

#8 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 22 enero 2014 - 11:02

Pues yo lo haria asi:

Semana 13 implica que el dia (13-1)*7 del año 2014, el 91, es de esa semana (el -1 es porque el 1/1/2014 ya de la semana 1, no la 0, aunque esto no lo se seguro, la semana 1 puede no empezar el 1/1 habría que adaptarlo), asi que si calculo ese dia, solo necesito ir para atras hasta que localice el lunes de esa semana, ese y los 6 siguientes son los que buscas:



delphi
  1. function GetDias(Anio, Mes: integer): TStringList;
  2. var
  3.   i: integer;
  4.   dia: TDate;
  5. begin
  6.   result:= TStringList.create;
  7.   dia:= StrToDate('01/01/'+IntToStr(Anio)) + (Semana-1)*7;
  8.   while DayOfTheWeek(dia)<>1 do
  9.     dia:= dia-1;
  10.   for i:= 0 to 6 do
  11.     result.add(DateToStr(dia+i));
  12. end;



Es de memoria, así que alguna línea podría no compilar, pero la idea se entiende.

Ojo que exactamente no se cual seria la semana 1 si el año empieza en viernes, igual la 1 empezaria el primer lunes del año. Esto habría que cambiarlo según sea el criterio bueno.

  • 0

#9 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 22 enero 2014 - 11:13

Se me han adelantado, pero lo dejo igual  :p



delphi
  1. function getDias(const anio,semana: integer):TStringList;
  2. var
  3.   i: Integer;
  4.   F: TDateTime;
  5. begin
  6.   F:= EncodeDate(anio,1,1);
  7.   for i:= 2 to Semana do
  8.     F:= F + 7;
  9.   F:= 1 + F - DayOfWeek(F);
  10.   Result:= TStringList.Create;
  11.   for i:= 0 to 6 do
  12.     Result.Add(DateToStr(F+i));
  13. end;



  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 enero 2014 - 11:26

Prueba con código Sergio

Semana 22
26/05/2014
27/05/2014
28/05/2014
29/05/2014
30/05/2014
31/05/2014
01/06/2014

Semana 3
13/01/2014
14/01/2014
15/01/2014
16/01/2014
17/01/2014
18/01/2014
19/01/2014

Prueba con código de Seoane

Semana 22
25/05/2014
26/05/2014
27/05/2014
28/05/2014
29/05/2014
30/05/2014
31/05/2014

Semana 3
12/01/2014
13/01/2014
14/01/2014
15/01/2014
16/01/2014
17/01/2014
18/01/2014

Muy interesante, excelentes códigos, rápidos, concisos y precisos, hay un detalle que me parece es un tema de año bisiesto.

Muchas gracias :)
  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 enero 2014 - 11:33

Ah no no

Yo soy el que está mal, depende de que día inicie la semana, Sergio la incia en lunes y Seoane en Domingo.

Excelente amigos, (y)

(b)

Saludos
  • 0

#12 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 22 enero 2014 - 11:39

Ah no no

Yo soy el que está mal, depende de que día inicie la semana, Sergio la incia en lunes y Seoane en Domingo.

Excelente amigos, (y)

(b)

Saludos


Efectivamente, aquí en España es costumbre empezar la semana los lunes, pero después del ejemplo que puso Fenareth supuse que la costumbre por allí es diferente
  • 0

#13 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 22 enero 2014 - 01:21

:shocked: ¿Mi código compiló? ...no me lo creo!
  • 0

#14 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 enero 2014 - 01:43

:shocked: ¿Mi código compiló? ...no me lo creo!


Bueno, sólo tuve que cambiar MES por SEMANA en los parámetros de la función, pero por lo demás funcionó y muy bien (y)  (b)

Saludos
  • 0

#15 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 enero 2014 - 01:45


Ah no no

Yo soy el que está mal, depende de que día inicie la semana, Sergio la incia en lunes y Seoane en Domingo.

Excelente amigos, (y)

(b)

Saludos


Efectivamente, aquí en España es costumbre empezar la semana los lunes, pero después del ejemplo que puso Fenareth supuse que la costumbre por allí es diferente


Pensé que lo habías hecho para no ajustarte a la norma ISO 8601 :D :D :D

En los calendarios que tengo por aquí, incluso en el calendario de mi computadora la semana comienza en domingo :)

Saludos
  • 0

#16 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 22 enero 2014 - 02:06

Propongo una solución que tiene en cuenta el primer día de la semana de la misma forma que TMonthCalendar (valor 1 para el lunes):



delphi
  1. function getDias(const anio,semana: integer; FirstDayOfWeek: integer = 1): TStringList;
  2. var
  3.   date: TDate;
  4.   i: integer;
  5. begin
  6.   date:= encodedate(anio, 1, 1) + semana*7-DayOfWeek(date)+(FirstDayOfWeek mod 7)-3;
  7.   Result:= TStringList.Create;
  8.   for i:= 0 to 6 do
  9.     Result.Add(DateToStr(Date+i));
  10. end;



Saludos.
  • 0

#17 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 22 enero 2014 - 03:03

Propongo una solución que tiene en cuenta el primer día de la semana de la misma forma que TMonthCalendar (valor 1 para el lunes):



delphi
  1. function getDias(const anio,semana: integer; FirstDayOfWeek: integer = 1): TStringList;
  2. var
  3.   date: TDate;
  4.   i: integer;
  5. begin
  6.   date:= encodedate(anio, 1, 1) + semana*7-DayOfWeek(date)+(FirstDayOfWeek mod 7)-3;
  7.   Result:= TStringList.Create;
  8.   for i:= 0 to 6 do
  9.     Result.Add(DateToStr(Date+i));
  10. end;



Saludos.


Tu eres de los que fuman "C ofuscado", eh?
  • 0

#18 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 22 enero 2014 - 03:22

Tu eres de los que fuman "C ofuscado", eh?


Si, fumo C pero no creo que ese código esté muy ofuscado aunque algo comprimido si. Alguien dijo que en delphi no se podía ofuscar el código y, ciertamente, es más difícil que en C.  ;)

Básicamente es la misma forma de cálculo que habéis usado pero corregido directamente con el día de la semana del primer día del año, siendo el cálculo más rápido. :D


Saludos.


  • 0

#19 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 enero 2014 - 04:53

Caray, muy buen código, tres formas de llegar a un mismo resultado, vaya que es un lujo. :)

Lo único que me molesta un poco es que evidencian mi pobre conocimiento :( :| : 8o|

Saludos  (b)
  • 0

#20 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 enero 2014 - 05:12

Te queda como tarea para la casa amigo que adaptes las propuestas a tu sistema para que se le pueda configurar como ha de comenzar la semana.  :D

Por aquí la norma ISO sobre el inicio de semana se la pasan por los *****. El que quiere hace los cálculos según inicio con Lunes y otros lo hacen por Domingo. Con decirte que si compras calendarios o agendas cualquiera puede hacerlo a su modo. No hay estandar por aquí. Lo que si está reglado es el formato de fechas: dd/mm/aa, dd/mm/aaaa.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.