Fecha en calendario juliano y gregoriano

Tus experiencias con la informática, o fuera de la informática
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Fecha en calendario juliano y gregoriano

Mensaje por Jonny »

Pongo este tema aquí, porque aunque tiene algo que ver con AutoIt, no se trata de código, si no de una función que estoy haciendo (tengo hecha) y no se muy bien como plantearla para que devuelva un buen resultado.

He hecho una función, que calcula el día de la semana y lo devuelve tanto en número, como por su nombre.
* no se si en la librería Date.au3 ya hay una función para eso, me suena que no...

La función es capaz de detectar a que tipo de calendario pertenece la fecha que recibe: Calendario juliano o calendario gregoriano.
Pero, también permite ajustar mediante un parámetro el calendario a usar para calcular el día de la semana. Así, si queremos saber en que cae el 15/01/1344 (he puesto la primera fecha que se me ha ocurrido) :), por defecto la función detectará que esa fecha pertenece al calendario juliano y calculará en qué calló, basándose en él. Pero, si queremos calcularlo en el calendario gregoriano (el que usamos hoy en día) basta indicarlo en un parámetro de la función.

El problema es que he estado buscando y buscando sobre estos dos calendarios. Está claro, que el calendario gregoriano se instauró en el 1582. Lo que no tengo claro es cuando exactamente. Porque en unos sitios he leído que el 24/02/1582, en otros el 04/10/1582 y en otros el 24/10/1582.

Yo de momento he establecido, que el cambio entre un calendario y el otro, se hizo el 24/02/1582.

Pero además, he leído que cuando se instauró el gregoriano, se saltaron 10 días... Eso no lo he programado, porque esos días han existido, en un calendario o en otro... y no se en cual deben ponerse. Supongo, que en el juliano...

¿Alguien sabe como va exactamente el lío ese de estos dos calendarios?. ¿Cuando se empezó a calcular la fecha en el gregoriano (cual fue el primer día de este calendario), en cual se calculan esos diez días que dicen que se saltaron para ajustar el tiempo al calendario gregoriano...

Sólo me queda hacer esos ajustes para terminar la función, que con alguna otra he hecho en una pequeña UDF, que pondré por aquí cuando la termine.

* Tal como está la función, las fechas prácticamente coinciden con un programilla que tengo que también calcula el día de la semana de cualquier fecha. Pero por ejemplo, el 25/10/1582 no coincide lo que devuelve mi función, con lo que devuelve ese programa. Al menos, no en el calendario gregoriano...

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Fecha en calendario juliano y gregoriano

Mensaje por Ximorro »

Yo hice hace mucho ese programa en Pascal, no sé por dónde andará.

¿Pero tienes el algoritmo preparado? Dices que la función está hecha, ¿la tienes ya en pseudocódigo?
Lo que puedes hacer es implementarla en AutoIt y así la vas probando (AutoIt es ideal para estas cosas).

Creo que te confundes en el uso de los calendarios, creo que no tiene mucho sentido dar una misma fecha en uno u otro (una vez fijado el país, mirad mi comentario de más abajo), por ejemplo en España o Portugal simplemente las fechas anteriores o iguales al 4 de octubre de 1582 son del calendario juliano y las posteriores al 15 de octubre de ese año son del gregoriano, que es el que seguimos usando actualmente.

O sea, si estabas viviendo en esa época el 4 de octubre, que fue jueves, al día siguiente, viernes, era 15 de octubre. Los días del 5 al 14 NO EXISTEN.

En serio, esas fechas no han existido en el calendario, un jueves era 4 y al día siguiente era 15 (y viernes, eso no cambió)
Es decir si la fecha es del calendario juliano tú da la del juliano, no tiene sentido decir que el 4 de octubre de 1582 en el juliano es el 14 de octubre de 1582 en el gregoriano.

Además de los días no existentes, para calcular el día de la semana tienes que tener en cuenta los años bisiestos, precisamente ese es el cambio que hizo el calendario gregoriano, que los calcula de manera diferente. Y por eso hicieron desaparecer algunos días, porque el juliano contaba bisiestos de más.

Conclusión, no te tienen que decir en qué calendario lo quieren, pues eso va determinado por la propia fecha, si acaso es una información adicional que puedes dar en un parámetro por referencia o algo así.
Por ejemplo si te piden
4/10/1582 debes devolver que era Jueves y que esa fecha es del calendario juliano
15/10/1582 debes devolver que era Viernes y que esa fecha es del calendario gregoriano
10/10/1582 debes devolver que esa fecha no existe

Por cierto, me suena que en Date.au3 sí hay funciones que tienen en cuenta los dos calendarios, pero no recuerdo con qué profundidad tratan el tema.
Ojo que otra cosa es que los programas no tengan en cuenta el cambio y digan que trabajan en calendario gregoriano incluso para las fechas del juliano.
Lo que están diciendo realmente es que no deberías usar ese programa para fechas del calendario juliano, porque no lo hace bien y simplemente usa el algoritmo del gregoriano para todo.

Te cuento todo esto porque hice el programa para la universidad y me tuve que estudiar el tema, que por cierto me pareció muy interesante. Naturalmente no me acordaba de todo (como las fechas exactas del cambio) pero para eso está la wipipedia ;-)
Última edición por Ximorro el 20 Nov 2012, 12:12, editado 3 veces en total.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Fecha en calendario juliano y gregoriano

Mensaje por Jonny »

Guau, que rapidez para responder ;). ¡así da gusto!. Gracias por responder tan rápido y tan bien explicado como siempre ;).

Sí, sí, tengo el código hecho. vamos, que la función va perfectamente. De hecho son varias. Como decía, es como una pequeña UDF, aunque ya se que está "Date.au3", pero bueno... creo que alguna de las funciones que he hecho (aunque no he hecho muchas de momento) quizás no están, o si están no son igual que las he hecho yo :). Y bueno, también he aprendido algo haciéndolas :).

Todo esto de los calendarios (que es interesante efectivamente). Y que calcular el día de la semana de una fecha, no requiere cientos de líneas, con bucles gigantes y complicados como me imaginaba... La verdad, es que me daba mucha pereza meterme con esto, porque tal como pensaba hacerlo era para volverse loco... Pero resulta que como no, está todo inventado ;). ¡existe un algoritmo para saber en qué cayó una fecha cualquiera!.

No se si lo harías así en Pascal. Yo lo he hecho usando la congruencia de Zeller:

http://es.wikipedia.org/wiki/Congruencia_de_Zeller

(no se si conocías ese algoritmo). Va muy bien para esto, porque con una pequeña modificación puedes calcular la fecha en un calendario u otro. Y en total pueden ser... ¿6 líneas? :).

Bueno. Lo de poner un parámetro para elegir el calendario, efectivamente. No tiene mucho sentido. Pero en algunas webs he visto que ponen herramientas para calcular el día de la semana en un calendario distinto al que pertenece la fecha realmente. Supongo que será a modo de curiosidad, porque efectivamente no tiene sentido en la práctica, pues el resultado no se correspondería con la realidad...

Por eso, he hecho que por defecto la función detecte el calendario y así devuelva el resultado real.

Es curioso. Si en el programilla que tengo para saber en que cae una fecha, pongo 04/10/1582, dice que fue Lunes. Si pongo 20/10/1582 dice que fue Miércoles (creo que este programa calcula todas las fechas en el calendario gregoriano, incluso las del calendario juliano).

Pero esque, si pongo: 13/10/1582 ¡dice que fue Miércoles! :).

Vaya, no tiene importancia, seguramente quien haya hecho el programa no haya contemplado que esa fecha no sea válida... Pero al haber probado casi con todo el 1582 y no decirme que ninguna fecha no fuera válida, por eso pensé que de alguna forma esos diez días habrían existido para alguno de los dos calendarios...

Lo bueno del algoritmo de Zeller es que contempla los años bisiestos, y tal como son en cada calendario. Así, que sí. En principio eso está contemplado. En la wikipedia y más sitios explican como funciona ese algoritmo y en qué se basa para funcionar. Pero tampoco es que me lo haya estudiado, así que no podría explicarlo muy bien :).

Así qué, tengo que poner los días entre el 04/10/1582 y 20/10/1582 sin incluir estos, como fechas no válidas. Cuando haga eso y poco más subo las funciones, a ver que os parecen.

* Nunca hubiera imaginado que esto de las fechas tuviese tanta miga... Pero viendo el algoritmo de Zeller, se ve que sí y que uno puede darle al coco lo que quiera y más :).
¡Nunca se me hubiera ocurrido calcular así el día de la semana de una fecha! (matemática pura y dura) :).

Salu2!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Fecha en calendario juliano y gregoriano

Mensaje por Jonny »

Ya he modificado el código para que quede tal como me has dicho. Que hasta el 04/10/1582 sea calendario juliano y desde el 20/10/1582 sea el gregoriano...

¿Lo de que el 4 de octubre de ese año fue Jueves, es verdad, o era por poner algo?. Porque con mi función me sale que el 4 de octubre fue Lunes y que el 20 fue Domingo (cada una en su calendario correspondiente: el 4 en el juliano y el 20 en el gregoriano).

En cambio, con el programa que uso para saber en qué cae una fecha, el 4 de octubre dice que fue Lunes. Pero el 20, dice que fue Miércoles...
Claro, que ese programa también dice que el 12/10/1582 (por ejemplo) fue Martes :).

Así, que si realmente el 4 de octubre del 1582 fue Jueves y el 20/10/1582 fue Viernes, algo no está bien; pero no se qué debe ser...


Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Fecha en calendario juliano y gregoriano

Mensaje por Ximorro »

Ay ay que en la explicación lie una cosa. Primero sí dije que el calendario gregoriano era desde el 15 de octubre pero luego no me preguntes por qué me puse a hablar del día 20. No, no, que es el 15. Ya he cambiado mi comentario de arriba para no liar más la cosa. :smt021

Vale, por partes: ¡algoritmo de Zeller! ¡No, no lo sabía! Menudo chollo, así no hay que hacer nada, ya tienes el método hecho.
Yo cuando hice el programa la cosa era currárselo, al fin y al cabo era para una asignatura de algorítmica y programación así que el tema estaba en encontrar uno mismo el algoritmo, no copiar uno hecho. Así que había que mirar los años bisiestos, los días por mes, el cambio de calendario, etc... y hacer el método que contemplara todo eso.

He implementado el de Zeller (tanto el puramente matemático de arriba como el algoritmo más preparado para ordenadores de abajo) y efectivamente funcionan perfectamente, qué elegancia.
Ojo que en la fórmula matemática el 0 es sábado pero en el método computacional el 0 es domingo.
Y si haces el de arriba lee la explicación que hay que ajustar los datos para enero y febrero.
Por cierto: ¿TE HAS FIJADO QUE SE HACE TODO CON ARITMÉTICA ENTERA? Es importante :smt003

Una vez más no das nada de código, así que tampoco daré el mío
:smt002 Aunque sólo he hecho el núcleo del meollo para hacer pruebas, ni entrada de datos de usuario por GUI ni comprobación de errores (fechas incorrectas).

NOTA IMPORTANTE: Yo hablo del cambio de calendario del 4 al 15 de octubre de 1582 ¡porque es cuando se cambió en España! Yo soy español e hice el programa para nuestras fechas en particular.
AHORA BIEN, otros países adoptaron el nuevo calendario más tarde, veo en la wikipedia que por ejemplo Grecia no lo hizo hasta ¡1923!
Aquí en "Línea temporal" tienes los datos para muchos países.
http://es.wikipedia.org/wiki/Calendario_gregoriano

Así que desde esta perspectiva sí podrías dar el día de la semana en ambos calendarios y que cada uno elija según en qué país está mirando la fecha, pero así cada uno se ve obligado a saber si tiene que mirar el juliano o gregoriano. Aún así está el problema de los días desaparecidos, hay que saber cuáles son y quitando los historiadores creo que poca gente sabe algo así.

Así que me temo que si sólo te dicen "dime qué día de la semana fue el 10 de septiembre de 1752" la cosa no es tan fácil ¡porque depende del país!
Por ejemplo
10-sept-1752 en España fue domingo (llevaban casi dos siglos de calendario gregoriano)
10-sept-1752 en Grecia fue jueves (faltaba casi dos siglos hasta el calendario gregoriano)
10-sept-1752 en Inglaterra ¡no existe! (pues pilla justo entre los días de ajuste)

Así que lo perfecto sería tener una tabla con las fechas de corte de cada país, y si se sabe, decir cuál fue la fecha en ese país según el calendario que le corresponda, o indicar si esa fecha no existe para ese país.
Si no se sabe el país o no se tiene el dato de ese país pues se da el día en los dos calendarios y el usuario tiene que elegir y saber cuándo es el cambio y qué días no existen.

Así que sí, el programa verdaderamente completo tiene mucha miga, incluso usando el chollo del método de Zeller.

Por lo demás que dices efectivamente ese programa que comentas es que sólo da días en el calendario gregoriano. Y las fechas no existentes por supuesto que hay que mirarlas por programación, la ecuación matemática esa es continua, da resultado para todas las fechas, existan o no. Ese programa que comentas calcula la función para el calendario gregoriano y no mira más.

Lo que yo hice en los viejos tiempos era bastante parecido a esto:
http://es.wikipedia.org/wiki/Calcular_e ... _la_semana
Pero en vez de llegar a un churrofórmula lo hice en plan más procedural y en vez de eso de los "meses correspondientes" miraba cuántos días tenía cada mes.

Por cierto, en date.au3 veo _DateToDayOfWeek y he comprobado que calcula sólo en el calendario gregoriano.
También tiene _DateToDayOfWeekISO pero simplemente es la otra pero dando lunes=1, la anterior es domingo=1
Así rápido no veo cosas específicas para el calendario juliano, ya no tengo tiempo para más así que si lo ves nos informas porfa.
(Añadido rápido: juliano en date.au3 -> mirad las funciones _DayValueToDate y _DateToDayValue)

Talueeeeec
Última edición por Ximorro el 27 Nov 2012, 15:28, editado 2 veces en total.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Fecha en calendario juliano y gregoriano

Mensaje por Jonny »

Ay ay que en la explicación lie una cosa. Primero sí dije que el calendario gregoriano era desde el 15 de octubre pero luego no me preguntes por qué me puse a hablar del día 20. No, no, que es el 15. Ya he cambiado mi comentario de arriba para no liar más la cosa
:)

Me extrañó un poco y te lo iba a preguntar; pero me puse a modificar el código y al final lo dejé en que del cinco al diecinueve de octubre incluidos, no existen y no le di más importancia

:)

Pero no creo que sea eso por lo que no funciona bien. Lo curioso, es, que desde la fecha actual en adelante sí devuelve el día de la semana correctamente. Incluso de fechas anteriores. Pero si pones una fecha relativamente lejana (veinte, treinta años...) ya no sale y no se por qué.

Yo antes de conocer ese algoritmo de Zeller, le di vueltas a como hacer todo ese cálculo. Dentro de lo complicado que se me antojaba, era más fácil de lo que realmente es viendo todo eso del calendario gregoriano, juliano... y como funciona cada uno.

Me dio por buscar como calcular el día de la semana, por casualidad, no se me ocurrió que fuera a haber ningún algoritmo, porque no se me ocurrió que los calendarios tuvieran cosas en las que basarse para hacer esto.

;)
He implementado el de Zeller (tanto el puramente matemático de arriba como el algoritmo más preparado para ordenadores de abajo) y efectivamente funcionan perfectamente, qué elegancia.
Ojo que en la fórmula matemática el 0 es sábado pero en el método computacional el 0 es domingo.
Yo he implementado esto:

Código: Seleccionar todo

a = (14 - Mes) / 12
y = Año - a
m = Mes + 12 * a - 2

Para el calendario Juliano:
d = (5 + dia + y + y/4 + (31*m)/12) mod 7

Para el calendario Gregoriano:
 d = (día + y + y/4 - y/100 + y/400 + (31*m)/12) mod 7
El resultado es un cero (0) para el domingo, 1 para el lunes… 6 para el sábado.
(el de abajo).

¿Aritmética entera?

:)

¿Qué es eso?.

Una vez más no das nada de código, así que tampoco daré el mío
Pero dije que lo daría, pero cuando esté bien

;)

¡Para que no me digáis que lo doy con errores! ;).

Puf... Yo en principio también lo he hecho pensando en España. Bueno, en el 15/10/1582... en todos los países que hicieran el cambio en aquel momento. Por eso, además de como curiosidad, podría estar bien poder ajustar el calendario a utilizar. Pero ahora que lo dices, es verdad, habrán casos en los que no se tenga un buen resultado, sobre todo por esos diez días que desaparecen entre un calendario y otro.


Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Fecha en calendario juliano y gregoriano

Mensaje por Ximorro »

Lo curioso, es, que desde la fecha actual en adelante sí devuelve el día de la semana correctamente. Incluso de fechas anteriores. Pero si pones una fecha relativamente lejana (veinte, treinta años...) ya no sale y no se por qué.
También hay que tener referencias fiables, que cuando más te alejas más difícil es. Si mi programa me dice que el 6/4/1722 es lunes y otro programa me dice que es viernes ¿cuál está bien? a saber.
Pero si ya te falla en fechas relativamente recientes te puedo dar una fiable para hacer pruebas: el 1/2/1972 fue martes. Seguro, me lo dijo mi madre. :smt003

No puedo ayudarte con el código si no lo publicas, pero ya te digo, si no te sale lo de Zeller pasa de él y haz el tuyo, será más largo porque el tal Zeller es un maldito genio pero te aseguro que se puede hacer. Al final siempre pasa por lo mismo: partir de una fecha conocida, por ejemplo 1/1/1900 es lunes, y para cada fecha contar cuántos días pasan de ella o faltan hasta ella. Para eso se cuentan años completos mirando cuántos bisiestos hay implicados (para contar de golpe 365 ó 366 días) y para la fracción de año que queda pues según los días que tengan los meses enteros implicados, finalmente se suman los días de pico que no llegan a sumar un mes y "ya está" ;-)
Para el juliano y el gregoriano es casi igual, sólo cambia la manera de computar los bisiestos.
Aunque no lo creas es lo que hace Zeller, pero de una manera ultracompacta y superingeniosa.
Dentro de lo complicado que se me antojaba, era más fácil de lo que realmente es viendo todo eso del calendario gregoriano, juliano... y como funciona cada uno.
¿Más fácil? Discrepo, creo que es tan complicado como parece.
De todas maneras si te parece manejable te recomiendo hacer tú mismo el algoritmo, en vez de usar el de Zeller que de todas maneras no entiendes y escapa a tu control. Si te diseñas tú el algoritmo te será más fácil implementarlo, en realidad eso será muy fácil, lo difícil es desarrollar el método.

Yo he implementado ese que pones y también la fórmula directa de Zeller que pone arriba, los dos funcionan perfectamente.

Aritmética entera es la que no usa decimales. En aritmética real (o coma flotante que se suele usar en ordenadores) por ejemplo 15/6=2.5, pero en aritmética entera 15/6 "es 2 y me quedan 3". El resultado se parte en cociente y resto pero como puedes ver no tienen decimales, por eso se dice que la aritmética es "entera", porque usa números enteros (porque negativos sí pueden ser).

Una sugerencia, si se discuten aquí cosas de programación ¿por qué no cambias esto a un subforo de programación? Al fin y al cabo se trata del desarrollo de un programa, quizás si lo pones en "Soporte", por ejemplo, recibirás más ayuda que en Chat.

Byeeee
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Fecha en calendario juliano y gregoriano

Mensaje por Jonny »

También hay que tener referencias fiables, que cuando más te alejas más difícil es. Si mi programa me dice que el 6/4/1722 es lunes y otro programa me dice que es viernes ¿cuál está bien? a saber.
Pero si ya te falla en fechas relativamente recientes te puedo dar una fiable para hacer pruebas: el 1/2/1972 fue martes. Seguro, me lo dijo mi madre.
;)

Pues con una fecha más reciente aún, con el 9/10/1983, es con la que no me coincide ni con el programa ese que uso para comparar el resultado de la función, ni con una página donde lo miré:

http://www.disfrutalasmatematicas.com/j ... emana.html

Los dos dicen que fue Domingo y parece que así fue...

:)

Pero la función que he hecho no dice lo mismo, dice que fue ¡Jueves!.

Ya he creado un tema con el código, aquí:

http://www.emesn.com/autoitforum/viewto ... 685#p14685

No se que fallará. He mirado y remirado el algoritmo y no veo que haya ningún fallo. Es poco probable que lo haya, porque es casi copiar&pegar

;)

Pero... A saber.
te aseguro que se puede hacer. Al final siempre pasa por lo mismo: partir de una fecha conocida, por ejemplo 1/1/1900 es lunes, y para cada fecha contar cuántos días pasan de ella o faltan hasta ella. Para eso se cuentan años completos mirando cuántos bisiestos hay implicados (para contar de golpe 365 ó 366 días) y para la fracción de año que queda pues según los días que tengan los meses enteros implicados, finalmente se suman los días de pico que no llegan a sumar un mes y "ya está
Bueno. La idea que tenía yo para hacerlo, antes de encontrar el algoritmo del monstruo de Zeller

;)

Hace tiempo, hice esta función en PHP y funcionaba bien, así que pensé en adaptarlo a AutoIt.

Por aquel entonces, no sabía nada de calendarios julianos, gregorianos... Pero sí pensé en la forma de obtener el día de la semana de una fecha y parece que di con la tecla, en cuanto a como hacerlo se refiere

:)

También es verdad, que PHP es diferente a AutoIt y tiene funciones que AutoIt no tiene, o más bien, son diferentes en uno y en otro.

La idea era como planteas. basarse en una fecha y a partir de ahí calcular el día de la semana de la fecha que recibe la función.

En PHP lo hice así, por si de paso, a alguien le sirve y partiendo de este código podemos sacar algo decente en AutoIt sin basarnos en el algoritmo de Zeller:

Código: Seleccionar todo

<?PHP
Function GetStampDate($_Hour, $_Min, $_Sec, $_Day, $_Mon, $_Year)
{
$BuffDate;
If (StrLen($_Mon)==2 && $_Mon[0]=="0")
{
$_Mon=$_Mon[1];
}
If (StrLen($_Day)==2 && $_Day[0]=="0")
{
$_Day=$_Day[1];
}
$DateStamp=MkTime($_Hour, $_Min, $_Sec, $_Mon, $_Day, $_Year);
$BuffDate=Date("l F", $DateStamp);
$DateSplit=Explode(" ", $BuffDate);
If (Count($DateSplit)!=2)
{
Return "null";
}
Else
{
Switch(StrToLower($DateSplit[0]))
{
Case "monday":
$DateSplit[0]="Lunes";
Break;
Case "tuesday":
$DateSplit[0]="Martes";
Break;
Case "wednesday":
$DateSplit[0]="Miércoles";
Break;
Case "thursday":
$DateSplit[0]="Jueves";
Break;
Case "friday":
$DateSplit[0]="Viernes";
Break;
Case "saturday":
$DateSplit[0]="Sábado";
Break;
Case "sunday":
$DateSplit[0]="Domingo";
Break;
}
Switch(StrToLower($DateSplit[1]))
{
Case "january":
$DateSplit[1]="Enero";
Break;
Case "february":
$DateSplit[1]="Febrero";
Break;
Case "march":
$DateSplit[1]="Marzo";
Break;
Case "april":
$DateSplit[1]="Abril";
Break;
Case "may":
$DateSplit[1]="Mayo";
Break;
Case "june":
$DateSplit[1]="Junio";
Break;
Case "july":
$DateSplit[1]="Julio";
Break;
Case "september":
$DateSplit[1]="Septiembre";
Break;
Case "october":
$DateSplit[1]="Octubre";
Break;
Case "november":
$DateSplit[1]="Noviembre";
Break;
Case "december":
$DateSplit[1]="Diciembre";
Break;
}
Return $DateSplit[0].", ".$_Day." de ".$DateSplit[1]." de ".$_Year;
}
}
?>
La verdad es que cuando probé esto y vi que funcionaba *flipé, porque no hacía tanto que tocaba PHP y no me pareció un código demasiado chapuza

;)

Pero dándole vueltas ahora para adaptarlo a AutoIt, veo que tiene un problema, si quiero que la función sirva para cualquier fecha.

Resulta, que lo que hago en el código PHP, es basarme en la fecha unix, que creo que era del 1970.

No he probado que pasaría, porque no tengo ningún servidor web con PHP y todo el rollo montado y en su día, no se me ocurrió probar que pasaba si le ponía el 14/2/141 (por ejemplo). Pero no creo que funcionara, tal como está hecha la función.

Así, que en AutoIt tampoco iría en ese caso. Sólo debería funcionar, con fechas posteriores a la "fecha unix".

Ahora, podría tomarse como referencia el 1/1/1, que por lo visto fue Lunes y hacer lo mismo que hace esta función...

La idea es evitar en medida de lo posible lo otro que se me ocurrió, que era recorrer fechas con un bucle, que relentizaría muchísimo la función.
¿Más fácil? Discrepo, creo que es tan complicado como parece.
:)

Me refería, a que en un principio, no sabía como funcionaba el calendario gregoriano ni el juliano. NO sabía por ejemplo, que los años bisiestos se calculaban diferente en uno y en otro, por eso ahora que lo se, me parece un poco más difícil. Pero sí, esto es bastante complicado y sin entrar en que cada país instauró el calendario gregoriano cuando quiso... El algoritmo en si, es chungo.
Una sugerencia, si se discuten aquí cosas de programación ¿por qué no cambias esto a un subforo de programación? Al fin y al cabo se trata del desarrollo de un programa, quizás si lo pones en "Soporte", por ejemplo, recibirás más ayuda que en Chat.
Porque nos hemos ido por las ramas

;)

En principio tenía dudas sobre cuando exactamente se instauró el calendario gregoriano y como era eso de los diez días que desaparecen... Pero al final hemos acabado hablando del algoritmo para calcular el día de la semana

:)

Pero si Basicos lo quiere mover, por mi ningún problema. Ahora la verdad es que estaría mejor en "Soporte".

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Fecha en calendario juliano y gregoriano

Mensaje por Ximorro »

Hola,
no tengo tiempo de mirarlo con detenimiento, he descargado el código pero la verdad, creo que haces las cosas más largas de lo que son, el código se podría simplificar muchísimo.
Por ejemplo usa arrays para los días de la semana, es mucho más compacto que el select...

En mi miniprograma el 9/10/1983 me da domingo para las dos implementaciones del algoritmo de Zeller, así que revísalo bien que no debes haberlo pasado bien del todo.
O prueba a pasar la fórmula de arriba, en vez de el de abajo, a ver si te aclaras mejor.

O como digo desarrolla tu propio algoritmo.
Parece que hables del código de PHP como si hubieras calculado tú el día de la semana, pero eso lo hacen las funciones MkTime y Date, ¡tú sólo lees el resultado!
Así que no sé qué quieres decir, ahí no has calculado bisiestos, días por mes y cosas de esas. Vaya, en realidad eso sí lo puedes hacer directamente en Autoit con la librería Date.au3, mira te pongo la de ¿tu cumpleaños? ;-) EN UNA LÍNEA:
MsgBox(4096, "", _DateDayOfWeek(_DateToDayOfWeek(1983,10,9)))

Eso sí, lo da en inglés, pero se puede usar un array para pasarlo a castellano (te recomiendo hacerlo así en tu programa, como ves es más compacto)
Local $aDias[8] = ["", "domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"]
MsgBox(4096, "", $aDias[_DateToDayOfWeek(1983,10,9)])


En este caso he hecho un rápido truco "sucio" porque _DateToDayOfWeek da valores de 1 a 7, no empieza de cero como las matrices, así que he creado un elemento en blanco en la posición cero. Otra solución es crear la matriz de 7 elementos con domingo en el cero y restar uno al acceder al índice devuelto por _DateToDayOfWeek, o sea:
Local $aDias[7] = ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"]
MsgBox(4096, "", $aDias[_DateToDayOfWeek(1983,10,9)-1])


Esas cosas no pasan con el método de Zeller, pues las dos formas dan valores de 0 a 7.
De todas maneras entiendo que la cosa era que querías hacer tú el algoritmo ¿no?. Claro que ya está hecho, en PHP que ya has usado y como ves también en AutoIt en Date.au3. Esto usa el calendario gregoriano pero también puedes calcular en el juliano, en otro comentario puse las funciones.

Bueno no me enrollo más. Ale dale caña y arréglalo que seguro que es una tontería. ¿Has mirado lo de la aritmética entera? Recuerda dar las divisiones como valores enteros, el cociente con Floor o Int, y si hiciera falta el resto con Mod (en la fórmula ya se usa explícitamente, es el resto de dividir por 7, que es el número de días por semana).
Por cierto, ¡recomiendo Int en vez de Floor! Hace correcciones que Floor no hace, prueba el resultado de esto y flipa:
Floor(0.7+0.2+0.1)
Int(0.7+0.2+0.1)

No dan lo mismo ¿verdad? ¿cuál es el correcto?
Cosas de la representación de reales en ordenadores, esos números tendrían infinitos decimales en binario, y claro, eso no cabe en ninguna memoria ;-)
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Fecha en calendario juliano y gregoriano

Mensaje por Jonny »

Vaya... Sí, sí que era una tontería.

Ya está el archivo actualizado, en el post que lo puse.

Resulta, que el resultado del algoritmo, lo pasaba a floor. Pero el de las divisiones que se hacen en el algoritmo no. Estaba tal cual, y era lo que hacía que con algunas fechas patinara.

Ahora, he pasado a int el resultado de todas las divisiones que se hacen en el algoritmo y el resultado final también, en vez de floor como hice yo en un principio.

Así que ¡Por fin! me dice que el 9/10/1983 fue Domingo

:)

También he modificado los selects. Es verdad, con un array queda más reducido el código. Así, que lo he modificado en Time_GetWeekDay() y en Time_GetMonName() que había otro select para obtener el nombre del mes que se le pasaba a la función.

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Fecha en calendario juliano y gregoriano

Mensaje por Ximorro »

Ale felicidades!

Por cierto no necesitas pasar a entero el resultado, la operación MOD debe devolverte un resultado entero al estar trabajando con operandos enteros.

Veo que pones una función para ver si un año es bisiesto, recuerda que la norma cambia con los calendarios así que si la fecha es juliana o gregoriana tienes que mirarlo de manera diferente.

byeee
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Fecha en calendario juliano y gregoriano

Mensaje por Jonny »

Lo de pasar a entero ¿te refieres al int() que envuelve el mod?.

Quítalo y verás...

En realidad, esa función que dices, es básicamente de Date.au3, pero he modificado un poco el código. Por ejemplo, el case que comprueba si el año es bisiesto, que como puedes ver tiene un paréntesis que engloba toda la comprobación, que está en dos partes, en Date.au3, está en dos case.
Así, que supongo (y creo que lo hace), comprueba si el año es bisiesto, tanto en el calendario juliano como en el gregoriano.

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Fecha en calendario juliano y gregoriano

Mensaje por Ximorro »

El Mod no debes necesitar pasarlo a entero, si quitas el Int global y te falla revísalo porque puedes haberte dejado algo.

En realidad Mod está pensado para trabajar sólo con enteros, por definición la operación "módulo" significa "el resto de la división entera". AutoIt permite usarla con valores reales pero realmente no queda clara la utilidad, de hecho en la ayuda pone que si usas reales la función no es precisa y puede no producir el resultado esperado.

Conclusión, asegúrate de que los operandos de Mod son enteros, así te dará el resultado esperado (el resto de la división) y no necesitarás pasarle un Int, porque ese resultado será entero.


Respecto a los bisiestos he hecho alguna prueba rápida y me temo que tanto la función de Date.au3 como la tuya sólo miran el calendario gregoriano. Son equivalentes, buen trabajo simplificando la expresión pero como la otra no mira el juliano pues la tuya tampoco porque hace lo mismo de otra manera.

Mira por ejemplo el 28/02/1500 que es viernes, y el 01/03/1500 es domingo, o sea que hay un día en medio así que es bisiesto. Por lo tanto el 29/02/1500 no debe darte error porque sí es bisiesto en el calendario juliano, tienes que decir que es sábado.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Fecha en calendario juliano y gregoriano

Mensaje por Jonny »

Hecharé un vistazo a lo del int global del mod del algoritmo. Me extrañó que me diera decimales, porque efectivamente, en la wikipedia por ejemplo que fue donde primero lo vi, no hacen nada especial con el resultado del mod. Pero a mi me devolvía decimales. Quizás porque en las divisiones que hay dentro del mod, no obtenía el resultado como int, no se...

Vaya, me la ha colao la función de Date.au3

:)

Efectivamente, claro. Si esa hace algo mal, la mía también... Entonces, me miraré con detenimiento como funciona eso de los años bisiestos (como se calculan) en un calendario y en otro y lo modificaré.

Thanks por encontrar el fallo

;)

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Fecha en calendario juliano y gregoriano

Mensaje por Ximorro »

Hombre, tampoco es que lo haga mal, es que esa udf trabaja fundamentalmente con calendario gregoriano, creo que para el juliano tenía un par de funciones de apoyo pero no vi gran cosa. Si dijeran que va también para el juliano sí que estaría fallando, pero se supongo que no hay que usar la udf fuera del gregoriano.

Como el objetivo de tu función es precisamente trabajar también para las fechas del calendario juliano pues te tocará mirarlo.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder