Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Calcular semana del año (https://www.clubdelphi.com/foros/showthread.php?t=70693)

DavidSG4 05-11-2010 12:35:53

Calcular semana del año
 
Bueno pues eso..

Dado una fecha ddmmaa necesito calcular la semana del año a la que pertenece esa fecha

ecfisa 05-11-2010 15:23:45

Hola DavidSG4.

Como cada mes del año tiene cuatro semanas se me ocurre que podría hacerse de este modo:
Código Delphi [-]
uses DateUtils;

function Semana(Date: TDate): Integer;
var
  dd: Integer;
begin
  dd:= DayOf(Date);
  Result := (MonthOf(Date)-1) * 4;  // N° semanas transcurridas hasta la fecha
  // Evaluar N° de semana actual y sumar al total
  if (dd > 0)and(dd < 8) then          
    Inc(Result, 1)                              
  else if (dd > 7)and(dd < 15) then
    Inc(Result, 2)
  else if (dd > 14)and(dd < 22) then
    Inc(Result, 3)
  else
    Inc(Result, 4);
end;

Ejemplo de llamada:
Código Delphi [-]
   ShowMessage(Format('Semana: %d',[Semana(Now)]));

Saludos. :)

DavidSG4 05-11-2010 15:56:11

buena pinta pero...
 
Hola y gracias por tu rapidez.

tiene buena pinta pero en años bisiestos por ejemplo.

Saludos y gracias de nuevo

José Luis Garcí 05-11-2010 16:01:21

Hola DavidSG4, prueba con la siguiente


Código Delphi [-]
//Calcula las semanas del año
function NumSemana(Fecha:string):integer;
var
   PrimerDia:TDate;
   DiaDelPrimerDia:integer;
begin
    {Calculamos primer dia del año}
    PrimerDia:=StrToDate('01/01/'+Copy(Fecha,7,4));

    {Calculamos dia de la semana que empieza por lunes}
    if DayOfWeek(PrimerDia)-1 =0
      then DiaDelPrimerDia:=7
      else DiaDelPrimerDia:=DayOfWeek(PrimerDia)-1;

    {Calculamos el numero de semana del año}
    Result:=Trunc(
                 (StrToDate(Fecha)-
                 PrimerDia+
                 DiaDelPrimerDia-1
                 ) /7)+1;
end;

ecfisa 05-11-2010 16:36:25

Cita:

Empezado por DavidSG4 (Mensaje 381422)
Hola y gracias por tu rapidez.

tiene buena pinta pero en años bisiestos por ejemplo.

Saludos y gracias de nuevo

Hola DavidSG4.

Si probás el código, verás que funciona correctamente con años bisiestos:
Código Delphi [-]
 ShowMessage(Format('Semana: %d',[Semana(StrToDate('29/02/2000'))]));

Saludos. :)

rrf 05-11-2010 16:52:30

Hola.

Hay una función llamada WeekOfTheYear.

Devuelve un valor entero entre 1 y 53 (nº máximo de semanas en un año).

Personalmente no la he probado nunca, pero posiblemente se ajuste a lo que buscas.

Saludos.

ecfisa 05-11-2010 17:26:31

Cita:

Empezado por rrf (Mensaje 381432)
Hola.

Hay una función llamada WeekOfTheYear.

Devuelve un valor entero entre 1 y 53 (nº máximo de semanas en un año).

Personalmente no la he probado nunca, pero posiblemente se ajuste a lo que buscas.

Saludos.

Hola rrf.

Tenés toda la razón, me había olvidado de ella... (ya que la he usado tanto como vos :D)

Pero cosa rara, aplicando la fecha '29/02/2000' la función WeekOfTheYear me devuelve 9, cuando en realidad las semanas transcurridas son 8.

No sé a que se deba...


Saludos. :)

rrf 05-11-2010 17:49:35

Lo he estado viendo y ese día está en la 9ª semana completa de ese año.

Supongo que esa es la idea, empieza a contar desde la primera semana completa de ese año, que empezó en sábado 1 y domingo 2 (estos 2 días no cuentan).

El día 3 de enero empieza la primera semana (completa) del año y ahí empieza a contar.

El día 29 creo que es un martes, pero de la 9ª semana (según la cuenta anterior).

Y supongo que, por ello, el resultado es 9; porque ese día está en la 9ª semana.

Se ve que lo que cuenta no son las semanas enteras transcurridas, sino el número de la semana en el que se encuentra ese día.

Saludos.

ecfisa 05-11-2010 18:16:22

Hola rrf.

Tu interpretación sobre como opera la función parece ser correcta.

Y me entero de algo que no sabia, la definición de Semana:
Cita:

"Serie de siete días naturales consecutivos,empezando por el lunes y acabando por el domingo,
aunque en algunos países empieza el domingo y termina el sábado."
Creo que es algo sobre lo que José Luis, estaba al tanto ;)

Saludos. :)

DavidSG4 08-11-2010 18:06:04

Casi funciona pero...
 
Hola y muchas gracias y felicitaciones por tu eficiencia.

Debe haber algo que no va bien porque si le selecciono la semana 1 01012010 va perfecto pero en cuanto le selecciono 11012010 me da una semana mas para todas las semanas.

quiero decir que exceptuando la semana uno para el resto te da una semana mas de la real y no veo porque.

Saludos y gracias de nuevo

Cita:

Empezado por José Luis Garcí (Mensaje 381423)
Hola DavidSG4, prueba con la siguiente


Código Delphi [-]//Calcula las semanas del año function NumSemana(Fecha:string):integer; var PrimerDia:TDate; DiaDelPrimerDia:integer; begin {Calculamos primer dia del año} PrimerDia:=StrToDate('01/01/'+Copy(Fecha,7,4)); {Calculamos dia de la semana que empieza por lunes} if DayOfWeek(PrimerDia)-1 =0 then DiaDelPrimerDia:=7 else DiaDelPrimerDia:=DayOfWeek(PrimerDia)-1; {Calculamos el numero de semana del año} Result:=Trunc( (StrToDate(Fecha)- PrimerDia+ DiaDelPrimerDia-1 ) /7)+1; end;


DavidSG4 08-11-2010 18:36:00

A si que funciona (Duda)
 
Claro incrementa una semana mas porque el 123 de enero lo coloca en la semana 53 del 2009. Esto porque ocurre.

Los años supuestamente solo tienen 52 semanas.

Gracias

DavidSG4 09-11-2010 18:34:36

Casi funciona pero...
 
Hola y muchas gracias y felicitaciones por tu eficiencia.

Debe haber algo que no va bien porque si le selecciono la semana 1 01012010 va perfecto pero en cuanto le selecciono 11012010 me da una semana mas para todas las semanas.

quiero decir que exceptuando la semana uno para el resto te da una semana mas de la real y no veo porque.

Saludos y gracias de nuevo


La franja horaria es GMT +2. Ahora son las 11:17:42.

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