Foros del Web » Programando para Internet » PHP »

Encontrar dia de la semana... ¿por qué falla?

Estas en el tema de Encontrar dia de la semana... ¿por qué falla? en el foro de PHP en Foros del Web. Hola, El código lo que hace es encontrar el día de la semana, a partir de una variable que se recibe por URL (número de ...
  #1 (permalink)  
Antiguo 02/11/2011, 06:52
 
Fecha de Ingreso: octubre-2011
Mensajes: 36
Antigüedad: 12 años, 6 meses
Puntos: 2
Pregunta Encontrar dia de la semana... ¿por qué falla?

Hola,

El código lo que hace es encontrar el día de la semana, a partir de una variable que se recibe por URL (número de días transcurridos desde 01/01/1583) y que dan la nueva fecha, que es la que tiene que encontrarse el día de la semana.

¿Alguna idea de porqué funciona con una fecha de partida (ej.12/10/2008) y con la otra no (ej.01/01/1583)? GRACIAS por adelantado.

Tengo que hacer que funcione con la fecha de partida a "01/01/1583"

Este es el código:

Código:
function weekDay($data,$diesAfegir)
{
list($day,$mon,$year) = explode('/',$data);
$NovaData=date('Y-m-d',mktime(0,0,0,$mon,$day+$diesAfegir,$year));
$diaConcret=date('N', strtotime("$NovaData"));
if ($diaConcret == '1') { $Res='Lunes'; }
if ($diaConcret == '2') { $Res='Martes'; }
if ($diaConcret == '3') { $Res='Miércoles'; }
if ($diaConcret == '4') { $Res='Jueves'; }
if ($diaConcret == '5') { $Res='Viernes'; }
if ($diaConcret == '6') { $Res='Sábado'; }
if ($diaConcret == '7') { $Res='Domingo'; }
return($Res);
}

$diesAfegir=$_GET["dies"];
echo weekDay('04/02/2008',$diesAfegir);
  #2 (permalink)  
Antiguo 02/11/2011, 07:22
 
Fecha de Ingreso: noviembre-2011
Mensajes: 55
Antigüedad: 12 años, 5 meses
Puntos: 3
Respuesta: Encontrar dia de la semana... ¿por qué falla?

mktime() — Obtener la fecha Unix de una fecha

Devuelve la fecha Unix correspondiente a los argumentos dados. Esta marca de tiempo es un integer que contiene el número de segundos entre la Época Unix (1 de Enero del 1970 00:00:00 GMT) y el momento especificado.

Parámetro Year

El número del año, puede ser un valor de dos o cuatro dígitos, con valores entre 0-69 mapeados a 2000-2069 y 70-100 a 1970-2000. En sistemas donde time_t es un entero con signo de 32 bit, como es lo más normal hoy en día, el rango válido para year es entre 1901 y 2038. Sin embargo, antes de PHP 5.1.0 este rango estaba limitado desde 1970 a 2038 en algunos sistemas (p.ej. Windows).
  #3 (permalink)  
Antiguo 02/11/2011, 10:07
 
Fecha de Ingreso: octubre-2011
Mensajes: 36
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Encontrar dia de la semana... ¿por qué falla?

Gracias por la información, pero, ¿hay algún modo de hacerlo?
  #4 (permalink)  
Antiguo 02/11/2011, 11:26
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 8 meses
Puntos: 793
Respuesta: Encontrar dia de la semana... ¿por qué falla?

Te falla porque las fechas que usen una representación POSIX se desbordan cuando llegan a 2.147.483.647 osea 03:14:07 UTC del 19 de enero de 2038, para solucionar eso puedes usar la clase DateTime:

Código PHP:
Ver original
  1. <?php
  2. function weekDayPlus($data, $days = 0) {
  3.     $dt = new DateTime($data);
  4.     if ($days != 0) {
  5.         $dt->modify("+ $days day");
  6.     }
  7.     $dw = $dt->format('N');
  8.     $bdata = array(1 => 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado', 'Domingo');
  9.     return $bdata[$dw] . ' ' . $dt->format('d-m-Y');
  10. }
  11.  
  12. echo weekDayPlus('01-01-1583', 10);

Cualquier duda me avisas.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #5 (permalink)  
Antiguo 02/11/2011, 12:40
 
Fecha de Ingreso: octubre-2011
Mensajes: 36
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Encontrar dia de la semana... ¿por qué falla?

Hola,

Muchas gracias por la ayuda. Pero el día de la semana que le corresponde a una fecha, parece que falla (al menos, a veces).

Por ejemplo, el 01-01-1583 fue sábado, y si añado cero días al código, me devuelve que fue domingo.

Será por los años de traspaso, ¿o no tiene nada que ver?

Saludos!
  #6 (permalink)  
Antiguo 02/11/2011, 12:46
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 8 meses
Puntos: 793
Respuesta: Encontrar dia de la semana... ¿por qué falla?

Pues 01-01-1583 va a ser domingo no sábado

Código PHP:
Ver original
  1. <?php
  2. function weekDayPlus($data, $days = 0) {
  3.     $dt = new DateTime($data);
  4.     $dt->modify("+ $days day");
  5.     $dw = $dt->format('N');
  6.     $bdata = array(1 => 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado', 'Domingo');
  7.     return $bdata[$dw] . ' ' . $dt->format('d-m-Y');
  8. }
  9.  
  10. echo weekDayPlus('01-01-1583', 0);

Edit: Sobre el número de la semana, las semanas empiezan en lunes usando W. Tal vez por eso te está dando resultados raros.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 02/11/2011 a las 13:06
  #7 (permalink)  
Antiguo 02/11/2011, 13:11
 
Fecha de Ingreso: octubre-2011
Mensajes: 36
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Encontrar dia de la semana... ¿por qué falla?

Bueno, gracias, es que vi por internet que en algunos sitios sale que el dia 01-01-1583 fue sábado, y en otros sale que fue domingo, como tu bien dices.

Domingo en [URL="http://www.calendario.es/enero-1583.html"]http://www.calendario.es/enero-1583.html[/URL]

Sábado en [URL="http://1583.calendardonkey.com/"]http://1583.calendardonkey.com/[/URL]

¿Serías tan amable de comentarme la parte del código donde pone...?

Linea 2

$days = 0

y la línea 4

$dt->modify("+ $days day");

Gracias!
  #8 (permalink)  
Antiguo 02/11/2011, 13:13
 
Fecha de Ingreso: octubre-2011
Mensajes: 36
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Encontrar dia de la semana... ¿por qué falla?

El if ($days != 0) { veo que no hacía falta, ¿no?
  #9 (permalink)  
Antiguo 02/11/2011, 13:16
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 8 meses
Puntos: 793
Respuesta: Encontrar dia de la semana... ¿por qué falla?

$days = 0 lo puse en caso de que no ingreses nada a la función, no va a dar error. (Es un parámetro por defecto)

$dt->modify("+ $days day");

Y esta línea lo que hace es sumar días a la fecha actual

+ 1 day por ejemplo en formato inglés. Puedes sumar semanas por ejemplo así: + 1 week

Pues yo le creo más a PHP que a cualquier página, para mí esa fecha es domingo.

Ese condicional no hacía falta por eso te la puse así:

Código PHP:
Ver original
  1. <?php
  2. function weekDayPlus($data, $days = 0) {
  3.     $dt = new DateTime($data);
  4.     $dt->modify("+ $days day");
  5.     $dw = $dt->format('N');
  6.     $bdata = array(1 => 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado', 'Domingo');
  7.     return $bdata[$dw] . ' ' . $dt->format('d-m-Y');
  8. }
  9.  
  10. echo weekDayPlus('01-01-1583', 0);

No va a dar error si sumas cero días, ya que sería la misma fecha que le pasas.

También puede que tengas razón. Según leí en esa época hubo un retraso astronómico. Así que... puede que sea sábado. Habría que consultar más ese tema. Lo curioso que me parece de este tema es que buscando "Los días que nunca existieron" sale el que te da problema.

Cita:
El porqué de este hecho tiene su explicación en la instauración de un calendario nuevo, vigente hasta nuestros días y denominado gregoriano
Que rollo este tema, yo lo trabajaría como lo trabaja la clase DateTime de PHP.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 02/11/2011 a las 13:50 Razón: Ortografía

Etiquetas: dia, encontrar, semana, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 14:11.