Date Helper: Tool per la gestione delle date

13 Apr 2019 | M.A.D.R.

Convertire date, sottrazioni addizioni non sarà un problema con uno snippet pronto all'uso: Date Helper.

Capita spesso leggere in giro per il web "Come sottrarre due date", o più comunemente come aggiungere un numero di giorni ad una data, questo piccolo snippet si avvale di elementari strutture per effettuare le diverse operazioni messe a disposizione del programmatore.

Vediamo subito come implementare le funzionalità di questo tool.

La parte funzionale più interessante è la possibilità passare come parametro alle varie funzioni, una stringa o un timestamp, lo snippet provvede ad effettuare le conversioni al posto nostro.

Indichiamo subito alcune dipendenze: NESSUNA, esatto hai letto bene nessuna dipendenza è richiesta per questo snippet.

Partiamo con la prima funzione utile time_to_date(time=123456,format='Y-m-d H:i:s',add=0), analizziamo punto per punto

  • time: Passare un timestamp o la conversione ad intero di una data
  • format: Formato output desiderato
  • add: Paramentro intero, aggiunge a time un intervallo temporale

Riportiamo un piccolo esempio:

$data_attuale=time();
$formato='Y-m-d H:i:s';
$aggiungi_giorno=3600*24;
echo time_to_date($data_attuale,$formato,$aggiungi_giorno);

In questo modo avremo la data di oggi con l'aggiunta di 1 giorno che altro non è 3600*24 ossia: 60 secondi * 60 minuti = 1ore.

Un giorno è composto da 24 ore, quindi 24 ore * 3600 secondi = 86400 secondi da sommare all'orario attuale convertito a intero.

Abbiamo infine dichiarato che vorremo la nostra nuova data nel formato: ANNO-MESE-GIORNO ORA:MINUTI:SECONDI.

Vediamo che il nostro snippet si comporta egregiamente con poche e semplici direttive, ma il bello deve ancora arrivare...

Immaginiamo di dover avere il numero di giorni di differenza tra due date, e successivamente vogliamo avere tutte le date comprese tra i due estremi....

Pensa....

Sarebbe anche facile, ma scrivere ad ogni progetto tutte le direttive e/o includere on demand file non è sempre bello, è anche poco professionale.

Il tool fa il suo lavoro in modo egregio e perfetto includendolo solo nella index del progetto, vediamo insieme come funziona la days_array_diff...

function days_array_diff($dt1,$dt2,$format='Y-m-d'){
		$data=[];
		(is_numeric($dt1))?$dt1=date('Y-m-d H:i:s',$dt1):null;
		(is_numeric($dt2))?$dt2=date('Y-m-d H:i:s',$dt2):null;
		if(strtotime($dt2)<strtotime($dt1)){
			$t=$dt2;$dt2=$dt1;$dt1=$t;
		}
		$diff=diff_date($dt1,$dt2,'%a');
		$d1=new DateTime($dt1);
		for($i=0;$i<$diff;$i++){
			$data[]=$d1->add(new DateInterval('P1D'))->format($format);
		}
		return $data;
	}

La funzione in questione provvede a gestire la differenza tra due date e restituisce un'array contenente tutti i giorni dal più "vecchio" al più "recente".

Possiamo infatti vedere come la nostra funzione adatti i parametri in base al dimensionamento, offrendo anche un confronto tra date per effettuare correttamente i calcoli.

Per recuperare il numero di giorni che intercorrono tra le due date (solo in questo caso) è possibile effettuare il count(result).

Solo Questo?

NO! Il nostro snippet non è solo questo, altre funzioni daranno all'utente l'informazione richiesta...

Doveroso ringraziamento alla filosofia d'approccio del framework CI, in quanto 2 funzioni sono state copiate dai suoi file helper.

/**
 * Copyright (c) 2019. Licenza Open Source - public domine
 * Il codice di questo file è reso disponibile secondo le regole vigente e con licenza d'uso PD.
 * Il codice riportato è un programma di cui codice sorgente è reso disponibile completo di tutte le sue
 * funzionalità e può essere modificato secondo le proprie esigenze.
 * Qualora il codice risultasse copiato su altri portali senza citarne la fonte saranno applicate tutte le
 * disposizioni in materia di Proprietà Intellettuale.
 */
/**
 * Created by phpS
 * User: macus_adi
 * Project Name: utils_git
 * File: date_helper.php
 * Path: root/helper/date_helper.php
 * Date: 17/02/2019
 * Time: 08:21
 */
if(!function_exists('human_date')){
	function human_date($time=0){
		return time_to_date($time);
	}
}
if(!function_exists('time_to_date')){
	function time_to_date($time=0,$format='Y-m-d H:i:s',$add=0){
		($add>0)?$time=add_time($time,$add):null;
		($time==0)?$time=time():null;
		return date($format,$time);
	}
}
if(!function_exists('mixed_interval')){
	function mixed_interval($start=0,$interval=1,$period='D',$format='Y-m-d H:i:s'){
		(!is_integer($start))?$start=strtotime($start):null;
		$dt=new DateTime();
		$dt->setTimestamp($start);
		$pmap=['S'=>'PT','M'=>'PT','H'=>'PT'];
		$p=$pmap[$period]??'P';
		$dt->add(new DateInterval($p.$interval.$period));
		return $dt->format($format);
	}
}
if(!function_exists('add_time')){
	function add_time($time=0,$add=3600){
		($time==0)?$time=time():null;
		return $time+$add;
	}
}
if(!function_exists('diff_date')){
	function diff_date($dt1,$dt2,$format='%Y-%m-%d %H:%i:%s'){
		(is_numeric($dt1))?$dt1=date('Y-m-d H:i:s',$dt1):null;
		(is_numeric($dt2))?$dt2=date('Y-m-d H:i:s',$dt2):null;
		$d1=new DateTime($dt1);
		$d2=new DateTime($dt2);
		return $d2->diff($d1)->format($format);
	}
}
if(!function_exists('days_array_diff')){
	function days_array_diff($dt1,$dt2,$format='Y-m-d'){
		$data=[];
		(is_numeric($dt1))?$dt1=date('Y-m-d H:i:s',$dt1):null;
		(is_numeric($dt2))?$dt2=date('Y-m-d H:i:s',$dt2):null;
		if(strtotime($dt2)<strtotime($dt1)){
			$t=$dt2;$dt2=$dt1;$dt1=$t;
		}
		$diff=diff_date($dt1,$dt2,'%a');
		$d1=new DateTime($dt1);
		for($i=0;$i<$diff;$i++){
			$data[]=$d1->add(new DateInterval('P1D'))->format($format);
		}
		return $data;
	}
}
/***********************HELPER CodeIgniter*/
if(!function_exists('gioni_mese')){
	function giorni_mese($month=0,$year=''){
		if ($month < 1 OR $month > 12)
		{
			return 0;
		}
		elseif ( ! is_numeric($year) OR strlen($year) !== 4)
		{
			$year = date('Y');
		}
		if (defined('CAL_GREGORIAN'))
		{
			return cal_days_in_month(CAL_GREGORIAN, $month, $year);
		}
		if ($year >= 1970)
		{
			return (int) date('t', mktime(12, 0, 0, $month, 1, $year));
		}
		if ($month == 2)
		{
			if ($year % 400 === 0 OR ($year % 4 === 0 && $year % 100 !== 0))
			{
				return 29;
			}
		}
		$days_in_month	= array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
		return $days_in_month[$month - 1];
	}
}

Soluzioni complete per ogni esigenza