PDA

Ver la Versión Completa : Calcular semana del año


DavidSG4
05-11-2010, 12:35:53
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:

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:

ShowMessage(Format('Semana: %d',[Semana(Now)]));


Saludos. :)

DavidSG4
05-11-2010, 15:56:11
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


//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
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:

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
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:

"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
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

Hola DavidSG4, prueba con la siguiente


Código Delphi [-] (http://www.clubdelphi.com/foros/#)//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
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
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