Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-11-2010
DavidSG4 DavidSG4 is offline
Miembro
 
Registrado: oct 2007
Posts: 92
Poder: 17
DavidSG4 Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 05-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.

Última edición por ecfisa fecha: 05-11-2010 a las 15:39:16.
Responder Con Cita
  #3  
Antiguo 05-11-2010
DavidSG4 DavidSG4 is offline
Miembro
 
Registrado: oct 2007
Posts: 92
Poder: 17
DavidSG4 Va por buen camino
buena pinta pero...

Hola y gracias por tu rapidez.

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

Saludos y gracias de nuevo
Responder Con Cita
  #4  
Antiguo 05-11-2010
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
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;
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #5  
Antiguo 05-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por DavidSG4 Ver Mensaje
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.
Responder Con Cita
  #6  
Antiguo 05-11-2010
rrf rrf is offline
Miembro
 
Registrado: ago 2003
Ubicación: S/C Tenerife, España
Posts: 454
Poder: 21
rrf Va por buen camino
Smile

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.
Responder Con Cita
  #7  
Antiguo 05-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por rrf Ver Mensaje
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 )

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.

Última edición por ecfisa fecha: 05-11-2010 a las 17:30:01.
Responder Con Cita
  #8  
Antiguo 05-11-2010
rrf rrf is offline
Miembro
 
Registrado: ago 2003
Ubicación: S/C Tenerife, España
Posts: 454
Poder: 21
rrf Va por buen camino
Smile

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.
Responder Con Cita
  #9  
Antiguo 05-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.

Última edición por ecfisa fecha: 05-11-2010 a las 18:20:26.
Responder Con Cita
  #10  
Antiguo 08-11-2010
DavidSG4 DavidSG4 is offline
Miembro
 
Registrado: oct 2007
Posts: 92
Poder: 17
DavidSG4 Va por buen camino
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í Ver Mensaje
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;
Responder Con Cita
  #11  
Antiguo 08-11-2010
DavidSG4 DavidSG4 is offline
Miembro
 
Registrado: oct 2007
Posts: 92
Poder: 17
DavidSG4 Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 09-11-2010
DavidSG4 DavidSG4 is offline
Miembro
 
Registrado: oct 2007
Posts: 92
Poder: 17
DavidSG4 Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
La semana del DBA roman Noticias 5 18-02-2010 19:49:33
Dia de la semana lokodelphi Varios 5 18-05-2006 22:46:32
calcular el numero de semana remialdo Varios 7 11-09-2005 08:02:05
Dia de la semana Carlex SQL 1 06-06-2004 20:45:54
La semana del Cu... jhonny Humor 0 23-12-2003 17:55:53


La franja horaria es GMT +2. Ahora son las 07:43:16.


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
Copyright 1996-2007 Club Delphi