Category Archives: php

PHP y el error al restar fechas después del cambio de hora

partimos de una funcion en PHP que resta dias

function restadias($fecha,$dias){
	list( $dia, $mes, $year ) = split( '/', $fecha );
	//teniendo la fecha tenemos que obtener el lunes y el viernes de esa semana.
	$f=mktime(0 , 0, 0, (int)$mes  , (int)$dia, (int)$year);
	$sumadias=60*60*24*($dias);
	$l=$f-$sumadias;
		$dia1=date('j',$l);
	if ($dia1<10){
		$d="0".$dia1;
	}else{
		$d=$dia1;
	}
	$mes1=date('n',$l);
	if ($mes1<10){
		$m="0".$mes1;
	}else{
		$m=$mes1;
	}
	$year1=date('Y',$l);
	$nf   = $d."/".$m."/".$year1;
	
	return $nf;
}

Si vemos la función, lo que hace es partir la fecha de texto dd/mm/aaaa y obtener el valor en segundos con mktime, luego los días que va a restar los multiplica por el número de segundos del día y hace la resta, el resultado lo formatea otra vez en formato dd/mm/aaaa

Así para el ejemplo:

echo restadias("03/03/2016",1);

El resultado es o debería de ser 02/03/2016

Pero para restadias("28/03/2016",1) cuando debería de darnos el día 27 nos devuelve un fatídico 26/03/2016.


1459123200 - 86400  = 1459036800

Y todo por el cambio de hora, como la función realiza el mktime pasando 0 en horas, minutos y segundos, al restar 86400 segundos según la funcion $dia1=date('j',$l)
Y lo vemos mejor viendo la hora:

date("H",$l);

Donde parte de las 0 y nos devuelve 23.

para solucionarlo, modificamos la función restadias por:

function restadias($fecha,$dias){
	list( $dia, $mes, $year ) = split( '/', $fecha );
	//teniendo la fecha tenemos que obtener el lunes y el viernes de esa semana.
	$f=mktime(12 , 0, 0, (int)$mes  , (int)$dia, (int)$year);
	$sumadias=60*60*24*($dias);
	$l=$f-$sumadias;
		$dia1=date('j',$l);
	if ($dia1<10){
		$d="0".$dia1;
	}else{
		$d=$dia1;
	}
	$mes1=date('n',$l);
	if ($mes1<10){
		$m="0".$mes1;
	}else{
		$m=$mes1;
	}
	$year1=date('Y',$l);
	$nf   = $d."/".$m."/".$year1;
	
	return $nf;
}

Donde hemos puesto como hora las 12, asi nos evitamos el problema del cambio de hora, de 2 a 3 de la mañana.

Cortar un texto para mandarlo por SMS sin cortar palabras

Vamos a preparar un script que nos trocea un texto en multiples SMS sin cortar palabras y añadiendo al final un contador de mensajes.

function ArrayTextosSMS($texto){
		$frases=array();
		$palabras=explode(" ",$texto);
		$frase="";
		$numpalabras=count($palabras);
		foreach($palabras as $palabra){
			$fraseadd=$frase." ".$palabra;
			if (strlen($fraseadd)>150){
				array_push($frases,trim($frase));
				$frase=$palabra;
			}else{
				$frase=$frase." ".$palabra;
			}
		}
		if ($frase!=""){
			array_push($frases,trim($frase));
		}
		$numfrases=count($frases);
		//añadimos un contador
		if ($numfrases>1){
			for($i=0;$i<$numfrases;$i++){
					$j=$i+1;
				$frases[$i]=$frases[$i]." ($j/$numfrases)";
			}
		}
		return $frases;
		
	}

el ejemplo es:

$texto="Este es un texto muy largo que queremos mandar mediante SMS, para ello hemos creado un script que nos lo trocea en partes de 150 caracteres y ademas le añade un contador de numero de mensajes. Ahora hay que encontrar un proveedor que nos permita mandar los sms, a ser posible de manera gratuita, pero todavia no he dado con ello. Si algun dia lo encuentro, lo compartiré en este mismo hilo";

print_r(ArrayTextosSMS($texto));die;

Que nos da como resultado:

Array
(
    [0] => Este es un texto muy largo que queremos mandar mediante SMS, para ello hemos creado un script que nos lo trocea en partes de 150 caracteres y ademas (1/3)
    [1] => le añade un contador de numero de mensajes. Ahora hay que encontrar un proveedor que nos permita mandar los sms, a ser posible de manera gratuita, (2/3)
    [2] => pero todavía no he dado con ello. Si algún día lo encuentro, lo compartiré en este mismo hilo (3/3)
)

El código esta disponible tambien en JAVA