{"id":228,"date":"2016-03-28T08:38:36","date_gmt":"2016-03-28T08:38:36","guid":{"rendered":"http:\/\/www.josejavierfm.es\/blog\/?p=228"},"modified":"2016-03-28T08:38:36","modified_gmt":"2016-03-28T08:38:36","slug":"php-y-el-error-al-restar-fechas-despues-del-cambio-de-hora","status":"publish","type":"post","link":"https:\/\/www.josejavierfm.es\/blog\/2016\/03\/28\/php-y-el-error-al-restar-fechas-despues-del-cambio-de-hora\/","title":{"rendered":"PHP y el error al restar fechas despu\u00e9s del cambio de hora"},"content":{"rendered":"<p>partimos de una funcion en PHP que resta dias <\/p>\n<pre>\r\nfunction restadias($fecha,$dias){\r\n\tlist( $dia, $mes, $year ) = split( '\/', $fecha );\r\n\t\/\/teniendo la fecha tenemos que obtener el lunes y el viernes de esa semana.\r\n\t$f=mktime(0 , 0, 0, (int)$mes  , (int)$dia, (int)$year);\r\n\t$sumadias=60*60*24*($dias);\r\n\t$l=$f-$sumadias;\r\n\t\t$dia1=date('j',$l);\r\n\tif ($dia1<10){\r\n\t\t$d=\"0\".$dia1;\r\n\t}else{\r\n\t\t$d=$dia1;\r\n\t}\r\n\t$mes1=date('n',$l);\r\n\tif ($mes1<10){\r\n\t\t$m=\"0\".$mes1;\r\n\t}else{\r\n\t\t$m=$mes1;\r\n\t}\r\n\t$year1=date('Y',$l);\r\n\t$nf   = $d.\"\/\".$m.\"\/\".$year1;\r\n\t\r\n\treturn $nf;\r\n}\r\n<\/pre>\n<p>Si vemos la funci\u00f3n, lo que hace es partir la fecha de texto dd\/mm\/aaaa y obtener el valor en segundos con mktime, luego los d\u00edas que va a restar los multiplica por el n\u00famero de segundos del d\u00eda y hace la resta, el resultado lo formatea otra vez en formato dd\/mm\/aaaa<\/p>\n<p>As\u00ed para el ejemplo:<\/p>\n<pre>\r\necho restadias(\"03\/03\/2016\",1);\r\n\r\n<\/pre>\n<p>El resultado es o deber\u00eda de ser 02\/03\/2016<\/p>\n<p>Pero para restadias(\"28\/03\/2016\",1) cuando deber\u00eda de darnos el d\u00eda 27 nos devuelve un fat\u00eddico 26\/03\/2016.<\/p>\n<pre>\r\n\r\n1459123200 - 86400  = 1459036800\r\n<\/pre>\n<p>Y todo por el cambio de hora, como la funci\u00f3n realiza el mktime pasando 0 en horas, minutos y segundos, al restar 86400 segundos seg\u00fan la funcion $dia1=date('j',$l)<br \/>\nY lo vemos mejor viendo la hora:<\/p>\n<pre>\r\ndate(\"H\",$l);\r\n<\/pre>\n<p>Donde parte de las 0 y nos devuelve 23.<\/p>\n<p>para solucionarlo, modificamos la funci\u00f3n restadias por:<\/p>\n<pre>\r\nfunction restadias($fecha,$dias){\r\n\tlist( $dia, $mes, $year ) = split( '\/', $fecha );\r\n\t\/\/teniendo la fecha tenemos que obtener el lunes y el viernes de esa semana.\r\n\t$f=mktime(12 , 0, 0, (int)$mes  , (int)$dia, (int)$year);\r\n\t$sumadias=60*60*24*($dias);\r\n\t$l=$f-$sumadias;\r\n\t\t$dia1=date('j',$l);\r\n\tif ($dia1<10){\r\n\t\t$d=\"0\".$dia1;\r\n\t}else{\r\n\t\t$d=$dia1;\r\n\t}\r\n\t$mes1=date('n',$l);\r\n\tif ($mes1<10){\r\n\t\t$m=\"0\".$mes1;\r\n\t}else{\r\n\t\t$m=$mes1;\r\n\t}\r\n\t$year1=date('Y',$l);\r\n\t$nf   = $d.\"\/\".$m.\"\/\".$year1;\r\n\t\r\n\treturn $nf;\r\n}\r\n<\/pre>\n<p>Donde hemos puesto como hora las 12, asi nos evitamos el problema del cambio de hora, de 2 a 3 de la ma\u00f1ana.<\/p>\n\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=josejavierfm\" class=\"twitter-share-button\">Twittear<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>partimos de una funcion en PHP que resta dias function restadias($fecha,$dias){ list( $dia, $mes, $year ) = split( &#8216;\/&#8217;, $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(&#8216;j&#8217;,$l); if ($dia1<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[15],"tags":[],"_links":{"self":[{"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/posts\/228"}],"collection":[{"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/comments?post=228"}],"version-history":[{"count":2,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/posts\/228\/revisions"}],"predecessor-version":[{"id":230,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/posts\/228\/revisions\/230"}],"wp:attachment":[{"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/media?parent=228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/categories?post=228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/tags?post=228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}