Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Rango de Semanas en un mes (https://www.clubdelphi.com/foros/showthread.php?t=47982)

Caro 12-09-2007 16:49:45

Rango de Semanas en un mes
 
Hola a todos

Como puedo obtener los rangos de las semanas de un mes X. por ejemplo mes de agosto tiene 5 semanas (1-5, 6-12, 13-19, 20-26, 27-31), eso es lo que quiero saber donde empieza y termina digamos la semana 1 que seria del 1 de agosto al 5 de agosto. Me pueden dar ideas por favor, que funciones de fechas debo usar mas o menos.

Lo unico que he encontrado es saber cuantas semanas tiene un mes con la función WeekOfTheMonth.

Muchisimas gracias por adelantado y que tengan un bonito dia.

gluglu 12-09-2007 17:28:29

No creo que tengas una función que te dé el resultado que buscas.

Tendrás que hacerla tu.

El principio de dicha función sería más o menos el siguiente:

1. Todos los meses empiezan por 1 :D ! (Trivial).
2. Saber el día de la semana del primer día del mes que buscas. (Función DayOfTheWeek). Tendrás que componer tu la fecha del primer mes que buscas con Encode.
3. A 8 le restas el resultado obtenido y tendrás el día final de la 1a semana.
4. A partir de ahí puedes obtener facilmente el resto de las semanas, teniendo en cuenta el número máximo de días que tenga el mes que estes tratando.

Espero haberte ayudado.

Saludos ;)

Caro 12-09-2007 18:11:33

Muchisimas gracias Gluglu, asi me ha quedado con tu explicación, solo funciona para el mes de agosto, ya es facil aumentar para que funcione cualquier mes.

Código Delphi [-]
var
 fechaIni,fechaFin:TDateTime;
 i, diaIni,diaFin,dia31, cantSem, cantDias :Integer;
begin

 fechaIni := EncodeDate(2007, 08, 01);
 cantSem := WeekOfTheMonth(EncodeDate(2007, 08, 31));

 diaIni := DayOfTheWeek(fechaIni);
 diaFin := 7-diaIni;

 fechaFin := IncDay(fechaIni, diaFin);

 showmessage(DateToStr(fechaIni)+'-'+DateToStr(fechaFin));
 for i:=2 to cantSem do
 begin
  fechaIni:=IncDay(fechaFin,1);

  if i=cantSem then
  begin
   cantDias := DaysInAMonth(2007,8);
   dia31 := DayOfTheWeek(EncodeDate(2007, 08, cantDias));
   fechaFin := IncDay(FechaFin,dia31)
  end
  else
   fechaFin:=IncDay(fechaFin,7);
   
  showmessage(DateToStr(fechaIni)+'-'+DateToStr(fechaFin));
 end;


Dime que te parece o puedo mejorarlo.

gluglu 12-09-2007 18:40:57

Creo que se podría optimizar de esta manera :

Código Delphi [-]
var
   fechaIni, fechaFin : TDateTime;
   i : Integer;
begin

  i := 1;
 
  while true do begin
 
    fechaIni := EncodeDate(2007, 08, i);
    if DayOfTheWeek(fechaIni) <> 1 then begin
      fechaFin := EncodeDate(2007, 08, 8-DayOfTheWeek(fechaIni))
      i := 8-DayOfTheWeek(fechaIni) + 1;
    end
    else begin
      i := i + 7;
      if i > DaysInAMonth(2007,8) then 
        fechafin := EndOfTheMonth(fechaIni)
      else
        fechaFin := DayInc(fechaIni,7);
    end;

    showmessage(DateToStr(fechaIni)+'-'+DateToStr(fechaFin));
 
    if i > DaysInAMonth(2007,8) then Break;
 
  end;
 
end;

No lo he probado, por lo que no te puedo asegurar si funciona correctamente. :o

Caro 12-09-2007 19:09:34

Muchas gracias de nuevo, ya lo he probado y funciona perfectamente, solo faltaba esto.

fechaFin := EncodeDate(2007, 08, 8-DayOfTheWeek(fechaIni)) un ; al final

fechaFin := DayInc(fechaIni,7); -> fechaFin := IncDay(fechaIni,6);

Saluditos

maeyanes 12-09-2007 19:32:18

Aquí te dejo una función que recibe un año y mes cualquiera y te va mostrando los rangos de las semanas del mes:

Código Delphi [-]
procedure ShowWeekRanges(AYear, AMonth: Word);
var
  StartDay: Integer;
  DaysInMonth: Integer;
  EndDay: Integer;

begin
  StartDay := 1;
  DaysInMonth := DaysInAMonth(AYear, AMonth);
  EndDay := 8 - DayOfWeek(EncodeDate(AYear, AMonth, 1));
  repeat
    ShowMessage(Format('%d - %d', [StartDay, EndDay]));
    StartDay := EndDay + 1;
    Inc(EndDay, 7);
    if EndDay > DaysInMonth then
      EndDay := DaysInMonth
  until
    StartDay > DaysInMonth;
end;


Saludos...

Caro 13-09-2007 01:31:00

Muchas gracias a ti también maeyanes.


La franja horaria es GMT +2. Ahora son las 12:15:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi