PHP DateTime y DateInterval

Vamos a ver algunas propiedades del objeto DateTime para manejar fechas y horas y del objeto DateInterval que se usa para algunas propiedades.

El objeto DateTime se instancia con la palabra clave new. Por defecto tendrá la fecha actual, pero podemos pasarle una cadena que nos indicará la fecha que queramos. Esta es similar a las que pasamos en strtotime y permite palabras como ‘tomorrow’, o ‘next month’:

$currentDateTime = new DateTime(); 
$yesterday = new DateTime('yesterday'); 
$twoDaysLater = new DateTime('+ 2 days'); 
$oneWeekEarly = new DateTime('- 1 week'); 
$dateTime = new DateTime('2015-01-01 12:30:12');

Otros ejemplos:

$valid_time_formats = ['now', 'jan 1 2016', '12 hours ago', 'next year', 'first day of next month', 'last day of this month', '12/25/2015', '@612835200'];

Una vez tenemos un objeto DateTime podemos formatearlo como se hacía con date():

$now = new DateTime();   
$ymdNow = $now->format('Y-m-d'); 
print_r($now->format('jS F Y'));   
print_r($now->format('ga jS M Y'));   
print_r($now->format('Y/m/d s:i:H'));

Podemos comparar dos fechas:

$today = new DateTime('today'); 
$yesterday = new DateTime('yesterday');  

var_dump($today > $yesterday); 
var_dump($today < $yesterday); 
var_dump($today == $yesterday);

// Output 
bool(true) 
bool(false) 
bool(false)

Podemos modificar una fecha con la propiedad modify, que permite añadir o quitar elementos igual que en strtotime:

$today = new DateTime('today');

$today->modify('-2 days');

Ejemplos de modificadores:

$modifiers = ['now', '+10 seconds', '+10 minutes', '+1 day', 'last second tomorrow', 'last day of this month', '12/31', '+3 months', '+1 year'];

Las fechas se pueden restar. Esto nos devuelve un objeto de tipo DateInterval, que veremos más adelante:

$today = new DateTime('today'); 
$yesterday = new DateTime('yesterday');  

$interval = $today->diff($yesterday);
echo $interval->format('%d day ago')

El formato de interval es parecido al de date, pero con el %.

También podemos añadir o restar intervalos a las fechas:

$today = new DateTime('today');
 
$today->add(new DateInterval('P2D'));
$today->sub(new DateInterval('P2D'));

El objeto DateInterval merece apartado propio. Se crea con una duración de un periodo determinado:

PYMDTHMS
P: period
Y: years
M: months
D: days
T: time
H: hours
M: minutes
S: seconds

Ejemplos:

P1Y 1 año
P1M 1 mes
P1D 1 día
P30D 30 días
PT1H 1 hora
PT5M 5 minutos
PT35S 35 segundos
P1Y6M29DT4H34M23S 1 año, 6 meses, 29 días, 4 horas, 34 minutos, 23 segundos

$Duration = new DateInterval( "P1Y2M3DT4H5M6S" );
print_r( $Duration );
Resultado:

DateInterval Object
(
[y] => 1
[m] => 2
[d] => 3
[h] => 4
[i] => 5
[s] => 6
...
)

$Duration = new DateInterval('P345D');
echo $Duration->format('P%yY%mM%dDT%hH%iM%sS'); // P0Y0M345DT0H0M0S

Algunos enlaces de utilidad:

https://www.startutorial.com/articles/view/master-php-datetime

http://www.bonify.io/blog/2014/09/its-about-time-we-talk-about-phps-datetime

http://php.net/manual/es/class.datetime.php

An Introduction to the PHP DateInterval Class

http://php.net/manual/es/class.dateinterval.php

Ejemplos cookie e include

Archivo muestracookie:

<?php
//Comprueba si hay una cookie llamada nombre y muestra el valor
$nombre = filter_input(INPUT_COOKIE, "nombre");
if (!empty($nombre)) {
 ?>
 <h4>Usuario: <?= $nombre ?></h4>
 <?php
}
?>

Index.php:

<?php
 //Comprueba que me hayan pasado un nombre, y si es así lo guarda en la cookie
 $nombre = filter_input(INPUT_GET, "nombre");

if (!empty($nombre)) {
 setcookie("nombre", $nombre, time() + 86400);
 }

include "muestracookie.php";
 ?>
 <form>
 Pon tu nombre: <input type="text" name="nombre">
 <input type="submit">
 </form>

Uso en otras páginas:

<?php
 include "muestracookie.php";
 ?>

Funciones de fecha y hora

Obtener la fecha actual:

print date('d-M-Y');

//Otros formatos:
$hoy = date("F j, Y, g:i a");                 // March 10, 2001, 5:16 pm
$hoy = date("m.d.y");                         // 03.10.01
$hoy = date("j, n, Y");                       // 10, 3, 2001
$hoy = date("Ymd");                           // 20010310
$hoy = date('h-i-s, j-m-y, it is w Day');     // 05-16-18, 10-03-01, 1631 1618 6 Satpm01
$hoy = date('\i\t \i\s \t\h\e jS \d\a\y.');   // it is the 10th day.
$hoy = date("D M j G:i:s T Y");               // Sat Mar 10 17:16:18 MST 2001
$hoy = date('H:m:s \m \i\s\ \m\o\n\t\h');     // 17:03:18 m is month
$hoy = date("H:i:s");                         // 17:16:18
$hoy = date("Y-m-d H:i:s");                   // 2001-03-10 17:16:18 (el formato DATETIME de MySQL)

Crear una fecha:

mktime (hora,minuto,segundo,mes,dia,año)
$mañana        = mktime(0, 0, 0, date("m")  , date("d")+1, date("Y"));
$mes_anterior  = mktime(0, 0, 0, date("m")-1, date("d"),   date("Y"));
$año_siguiente = mktime(0, 0, 0, date("m"),   date("d"),   date("Y")+1);

Convertir cadenas en fecha:

echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";

Otro ejemplo filter_input

<?php
 $nombre = filter_input(INPUT_POST, "nombre");
 $password = filter_input(INPUT_POST, "password");

$error = [];

if (empty($nombre)) {
 $error[] = "Falta nombre";
 }
 if (empty($password)) {
 $error[] = "Falta password";
 }
 if ($nombre != "Juan" || $password != "1234") {
 $error[] = "Nombre / contraseña incorrecto";
 }
 if (!empty($error)) {
 ?>
 <p>Se han encontrado los siguientes errores</p>
 <p><?= implode(". ", $error) ?></p>
 <a href="index.php">Volver</a>
 <?php
 } else {
 echo "Adelante";
 }
 ?>

Ejemplo filter_input

<form action="contenido.php" method="post">
 Introduce Nombre: <input type="text" name="nombre">
 Introduce Password: <input type="password" name="password">
 <input type="submit">

</form>

 

<?php
 $nombre = filter_input(INPUT_POST, "nombre");
 $password = filter_input(INPUT_POST, "password");

if (empty($nombre)) {
 ?>
 <p>Introduce el nombre, por favor</p>
 <a href="index.php">Volver</a>
 <?php
 die();
 }
 if (empty($password)) {
 ?>
 <p>Introduce el password, por favor</p>
 <a href="index.php">Volver</a>
 <?php
 die();
 }
 if ($nombre=="Juan" && $password=="1234"){
 echo "Adelante";
 }
 else{
 ?>
 <p>Datos incorrectos</p>
 <a href="index.php">Volver</a>
 <?php 
 }
 ?>

Función ajedrez PHP

<?php

function ajedrez($tam) {
 ?>
 <table border="1">
 <?php for ($i = 0; $i < $tam; $i++) {
 ?>
 <tr>
 <?php for ($j = 0; $j < $tam; $j++) {
 ?>
 <td <?=($i + $j) % 2 == 0?'style="background-color:black"':''?>></td>
 <?php } ?>
 </tr> <?php } ?>
 </table> <?php
 }

ajedrez(8);
 ?>

Lanzamiento moneda

<?php

function lanzamiento($num = 3) {
 $caras = 0;
 $tiradas = 0;
 while ($caras < $num) {
 $moneda = rand(1, 2);
 if ($moneda == 1) {
 // echo "C";
 $caras++;
 } else {
 // echo "X";
 $caras = 0;
 }
 $tiradas++;
 }
 return $tiradas;
 }

for ($j = 1; $j <= 8; $j++) {
 $tiradas = 0;
 for ($i = 0; $i < 1000000; $i++) {
 $tiradas += lanzamiento($j);
 }
 echo $j." : ".($tiradas / 1000000)."<br/>";
 }
 ?>

Ejemplos cadenas y expresiones regulares

<?php
 $cadena = "Hola que tal?";
 $buscar = "Ho";
 echo strpos($cadena, "Ho"); //Devuelve 0
 echo strpos($cadena, "ho"); //Devuelve false
 echo stripos($cadena, "ho"); //Devuelve 0 (case insensitive)
 echo strpos($cadena, "Pepe"); //Devuelve false
 echo strpos($cadena, "la"); //Devuelve 2

if (strpos($cadena, "WW") === false) {
 echo "NO está";
 }
 if (strpos($cadena, "Ho") === false) {
 echo "NO está";
 }

//$substring = substr($string, $start, $length);
 $codigo = 'ABCD123456';
 $parte = substr($codigo, 0, 4); //$parte='ABCD'
 $parte = substr($codigo, 4, 4); //$parte='1234'
 $parte = substr($codigo, 4); //$parte='123456'
 $parte = substr($codigo, -4); //$parte='3456'

echo strlen($codigo); //Longitud de una cadena

echo str_word_count($cadena);

print ucfirst("how do you do today?"); //Primera letra
 print ucwords("the prince of wales"); //primera letra de cada palabra
 print strtoupper("i'm not yelling!"); //mayúsculas
 print strtolower('one'); // minúsculas
 $cadena = "Hola que tal?";
 echo str_replace("la", "lalala", $cadena);
 echo str_ireplace("La", "lalala", $cadena);

echo trim(" hola que tal "); //Quita espacios alrededor
 echo strrev($cadena); //Le da la vuelta a la cadena

function esMail($cadena) {
 $pos1 = strpos($cadena, "@");
 $pos2 = strpos($cadena, ".");
 if ($pos1 === false || $pos2 === false) {
 return false;
 }
 if ($pos1 > $pos2) {
 return false;
 }
 return true;
 }

function esMail2($cadena) {
 $pos1 = strpos($cadena, "@");
 $pos2 = strrpos($cadena, ".");
 return $pos1 !== false && $pos2 !== false && $pos2 > $pos1;
 }

function esMail3($cadena) {
 return preg_match("/.+@.+\..+/", $cadena);
 }

echo "<hr>";
 echo var_dump(esMail("pepe@pepe.com"));
 echo var_dump(esMail("hola que tal"));
 echo var_dump(esMail("pepe.pepe@com"));
 echo "<hr>";
 echo var_dump(esMail3("pepe@pepe.com"));
 echo var_dump(esMail3("hola que tal"));
 echo var_dump(esMail3("pepe.pepe@com"));
 echo "<hr>";

$string = "Hola que 454 56tal 667 php89 es pooop";
 preg_match_all("/[0-9]{2,3}/", $string, $matches);
 var_dump($matches); // hla

$cp1 = "08001";
 $cp2 = "009";

var_dump(preg_match("/[0-9]{5}/", $cp1));
 var_dump(preg_match("/[0-9]{5}/", $cp2));

echo "El alcalde de l'hospitalet ha dicho \"No dimitiré\"";
 echo "<div onclick='saludo(\"hola\")'>";

function emailValidation($email) {
 $regex = "/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,10})$/";
 $email = strtolower($email);

return preg_match($regex, $email);
 }
 ?>

Dibujar un array

<?php
 $miArray = [3, 4, "pepe", [53, 4, 5], false];
 $miArray = [[1, 2], [3, 4]];

function pintaArray($array) {
 ?>
 <table border="1">
 <?php
 foreach ($array as $valor) {
 if (!is_array($valor)) {
 $valor = [$valor];
 }
 ?>
 <tr>
 <?php foreach ($valor as $v) { ?>
 <td><?= $v ?></td>
 <?php } ?>
 </tr>
 <?php } ?>
 </table>
 <?php
 }

pintaArray($miArray);
 ?>

Arrays en PHP

<?php
 $miArray = [3, 4, "pepe", 5, false];
 $otro = array(3, 4, 5);
 var_dump($miArray);
 var_dump($otro);

$miArray[] = "otro elemento";
 $miArray[] = "y otro más";

var_dump($miArray);

$asociativo = ["a" => 5, "b" => 6, "c" => 12];
 foreach ($asociativo as $clave => $valor) {
 echo $clave . " - " . $valor . "<br/>";
 }
 $multi = [
 [1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]
 ];
 echo $multi[1][1]."<br/>";
 for ($i = 0; $i < count($multi); $i++) {
 for ($j = 0; $j < count($multi[$i]); $j++) {
 echo $i . " - " . $j . " : " . $multi[$i][$j] . "<br/>";
 }
 }
 foreach ($multi as $f=>$filas){
 foreach($filas as $c=>$valor){
 echo $f." - ".$c." : ".$valor."<br/>";
 }
 }
 
 print_r($multi);
 ?>