close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 13 years ago

Closed 12 years ago

#1600 closed doubt (remind)

Duda sobre TheBegin y TheEnd

Reported by: imendez Owned by: Víctor de Buen Remiro
Priority: normal Milestone: Mantainance
Component: Kernel Version: 3.1
Severity: minor Keywords:
Cc: atorre@…

Description

Hola, si definimos la fecha:

Date a = y1582m12d31;

o cualquiera anterior en el tiempo, TOL nos devuelve el valor TheBegin.

La siguiente función trata de devolver, a partir de una serie cuyo fechado es un subconjunto de diario (entendido como lunes-viernes, martes, etc.), la misma serie entre el primer mes en el que la serie tome valor desde el primer día del mes, y el último mes en el que tome valor hasta el último día.

Serie CompletedMonth(Serie varDia)
//////////////////////////////////////////////////////////////////////////////
{ 
  Date Final = Last(varDia);
  Date FinalAux = Succ(Final, Dating(varDia), 1);
  Date FinalDate = If( Month(Final) == Month(FinalAux),
    Succ(Succ(FinalAux,Mensual,-1),Dating(varDia),-1),
    Final);
  
  Date Initial = First(varDia);
  Date InitialAux = Succ(Initial, Dating(varDia), -1);
  Date InitialDateAux = If(Month(Initial) == Month(InitialAux),
    Succ(Initial,Mensual,1),
    Initial);
  Date InitialDate = If( Belong(InitialDateAux, Dating(varDia)),
    Date InitialDateAux,
    Date Succ(InitialDateAux, Dating(varDia), 1));
  
  Set fechas = [[ InitialDate, FinalDate]];

  Serie dia = If(Card(fechas) > 0, 
    { 
      Date fec1 = fechas[1]; 
      Date fec2 = fechas[2];
      Serie TruncvarDia = SubSer(varDia, fec1, fec2);
      TruncvarDia 
    }, 
    { 
      WriteLn("El fechado de la serie es incompatible");
      CalInd(C,Diario)
    })    
};

Seguro que la función se puede hacer más bonita (y eficiente), pero mi duda es la siguiente: cuando la aplico a la siguiente serie

Serie sr = SubSer(CalInd(C, Diario), y1583m01d02, y1583m01d02);
Serie srC = CompletedMonth(sr);

Me devuelve un serie srC cuya fecha final es TheEnd.
Es decir, la línea

Succ(Succ(FinalAux,Mensual,-1),Dating(varDia),-1)

donde FinalAux es y1583m01d03, devuelve TheEnd.
Sé que es rebuscado, pero ¿es normal?

Saludos,
Iván


Change History (2)

comment:1 Changed 13 years ago by Víctor de Buen Remiro

Pues resulta que nuestro calendario actual, el calendario gregoriano , comienza el día 1 de enero de 1583, bueno en realidad fue el 15 de octubre de 1582, pero por redondear a años tomamos el siguiente día de año nuevo.

Al jueves del calendario juliano 4 de octubre de 1582 le sucede el viernes del calendario gregoriano 15 de octubre de 1582. Diez días desaparecen debido a que ya se habían contado de más en el calendario juliano.

Para tratar fechas anteriores habría que empalmar los dos calendarios lo cual supone un trabajo importante de dudosa utilidad, por eso se tomó este día como inicio del tiempo.

El caso es que la expresión

Date Succ(Succ(y1583m01d03,Mensual,-1),Diario,-1);

no devuelve TheEnd sino TheBegin como era de esperar.

Es el SubSer el que no funciona bien si la fecha final es TheBegin pues probablemente no se haya contemplado esa posibilidad. Lo estudiaré a ver si lo encuentro aunque este tipo de cosas son complicadas de resolver.

comment:2 Changed 12 years ago by Víctor de Buen Remiro

Resolution: remind
Status: newclosed
Note: See TracTickets for help on using tickets.