Anno mesi giorni

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
Buongiorno a tutti,
questo codice calcola la differenza tra start ed end, funziona ma in caso dell'anno attuale (2020) mi restituisce 0 Year In The Business
ho pensato allora d' integrare anche i mesi e i giorni trascorsi, ovviamente il calcolo verra effettuato con il campo start e la data attuale ( today)
ci ho provato ma senza successo :(
suggerimenti?
Grazie

PHP:
<?php     // code calcolo anno
$start = $row['start'];
$end = !empty($row['end']) ? $row['end'] : date('Y');
$diff = $end - $start;
echo '<font color="blue">'. $diff . ' Year' . ($diff > 1 ? 's' : '') . '&nbsp' . In . '&nbsp' . The . '&nbsp' . Business . '</font>';
?>
 
Ultima modifica:
questo codice ti aiuta di sicuro, poi lo sistemi come desideri
PHP:
$datetime = "2000-01-01";

$diff = date_create('now')->diff( date_create($datetime) );

echo $diff->y . " year"   . " - "
   . $diff->m . " month"  . " - "
   . $diff->d . " day"    . " - "
   . $diff->h . " hour"   . " - "
   . $diff->i . " minute" . " - "
   . $diff->s . " second";

die;

1594296912835.png
 
Ciao marino, grazie per la risposta

dunque ho aggiustato il codice e il risultato non e' quello che volevo ottenere

in pratica il calcolo dovrebbe partire da inizio 2020 a oggi, il campo di riferimento e' start

sshot-1.png


codice temporaneo

PHP:
<?php

$datetime = $row['start'];

$diff = date_create('now')->diff( date_create($datetime) );

echo $diff->y . " year"   . " - "
   . $diff->m . " month"  . " - "
   . $diff->d . " day"    . " - "
   . $diff->h . " hour"   . " - "
   . $diff->i . " minute" . " - "
   . $diff->s . " second";

die;

?>
 
Devi convertire $row['start'] in un vero oggetto date time altrimenti se è presente solo l'anno l'ora sarà sempre 20:20..
Cioè se è solo l'anno rimpiazza con -01-01 00:00:00 (mese,giorno e ora);
20:20 - 14:30 = 5.55
 
Devi convertire $row['start'] in un vero oggetto date time altrimenti se è presente solo l'anno l'ora sarà sempre 20:20..
Cioè se è solo l'anno rimpiazza con -01-01 00:00:00 (mese,giorno e ora);
20:20 - 14:30 = 5.55

Ciao Hormus,
non ho bisogno di ore, minuti, secondi, questi dati li ha aggiunto marino51,
ho bisogno solo di mese e giorni solo in caso sia presente l'anno corrente preso da campo start
quindi se l'anno e' 2020 deve visualizzarmi i mesi trascorsi e i giorni a partire da Gennaio
 
Scusa forse mi sono espresso male, phpha un bug se è presente solo la data l'alternativa è creare una data completa.
Usa il timezone anche per il primo oggetto DateTime.
PHP:
$datetime = '2020';
if( strlen($datetime) <5 )
$datetime = '2020-01-01 00:00:00.000000';
$timezone = timezone_open('Europe/Rome');
var_dump(date_create($datetime,$timezone));
 
Hormus non capisco come adattare il codice, non pensavo che un semplice script fosse cosi complicato, :(
 
A bene su questo non avere timore posso aiutarti però quando scrivo c'è sempre un perché mica scrivi a caso.
PHP:
$datetime = $row['start'];
if( strlen($datetime) <5 )
$datetime = "$datetime" . '-01-01 00:00:00.000000';
$timezone = timezone_open('Europe/Rome');
$diff = date_create('now', $timezone)->diff( date_create($datetime, $timezone) );

$year = $diff->y;
$mese = $diff->m;
$giorni = $diff->d;
if($year) {
echo $year;
} else {
if($mese == 0 && $giorni == 0) {
echo 'anno corrente';
} elseif($mese) {
echo $mese;
} elseif($giorni) {
echo $giorni;
}
}

die;
Ti funziona? Lo devi semplicemente formattare su come vuoi visualizzarlo.
 
  • Like
Reactions: Alex_70
formattato e testato su altri anni, :) ottimo lavoro, posso sostituirlo con quello precedente

solo non mi segna i giorni in caso di anno corrente :rolleyes:

sshot-4.png


sshot-5.png


grazie Hormus, sei stato molto gentile ad aiutarmi :)
 
Cambia l'ultimo elseif in if e mettilo su una nuova riga.

ok, adesso funziona, :)

per formattare ho adottato questa tecnica inserendo la variabile $testo, penso sia giusto :rolleyes:

die;
eliminato perche' non mi passava gli altri dati

PHP:
$testo = 'In The Business';

$year = $diff->y;
$mese = $diff->m;
$giorni = $diff->d;
if($year) {
echo '<font color="blue">' . $year . '</font>' . '&nbsp; years &nbsp;' . $testo;
} else {
if($mese == 0 && $giorni == 0) {
echo 'anno corrente';
} elseif($mese) {
echo '<font color="red">' . $mese . '</font>' . '&nbsp; months &nbsp;' ;
} 
if($giorni) {
echo '<font color="green">' . $giorni . '</font>' . '&nbsp; days &nbsp;' . $testo;

sshot-6.png


Grazie ancora Hormus;)
 
caspita, ho trovato un errore mio :(,
siccome il codice precedente calcolava la differenza tra il campo start ed end adesso con il nuovo codice questo non funziona piu correttamente

esempio questo, dovrebbe visualizzare 2 years In The Business
invece :rolleyes:

sshot-7.png
 
Ciao $start e $end sarà espanso a una data completa se ci sono meno di cinque caratteri.
PHP:
$timezone = timezone_open('Europe/Rome');
$now = date_create("now",$timezone);
$start = (strlen($row['start']) < 5) ? "{$row['start']}-01-01 00:00:00" : $row['start'];
$end = (!empty($row['end']) ? ((strlen($row['end']) < 5) ? "{$row['start']}-01-01 00:00:00" : $row['start']) : ($now->format('Y')));
$diff = date_create($end, $timezone)->diff( date_create($start, $timezone) );

$year = $diff->y;
$mese = $diff->m;
$giorni = $diff->d;
if($year) {
echo $year;
} else {
if($mese == 0 && $giorni == 0) {
echo 'anno corrente';
} elseif($mese) {
echo $mese;
}
if($giorni) {
echo $giorni;
}
}
Al solito aggiusta la formattazione, Se l'anno è diverso da zero visualizzi la differenza altrimenti visualizzi il mese o il giorno se anche questi sono uguali visualizzi anno corrente.
 
  • Like
Reactions: Alex_70
test nuovo codice con campi start ed end

anno 2020
start
visualizza mesi e giorni
OK
sshot-1.png

anno 2010
start
visualizza anni trascorsi
OK
sshot-2.png


anno 2016 - 2018
start
end

visualizza anno corrente,
sbagliato, dovrebbe visualizzare 2 years (differenza)
DA FIXARE
sshot-3.png
 
Sostituisci con questo $end.
PHP:
$end = (!empty($row['end']) ? ((strlen($row['end']) < 5) ? "{$row['end']}-01-01 00:00:00" : $row['end']) : ($now->format("Y-m-d H:i:s")));
 
  • Like
Reactions: Alex_70
Sostituisci con questo $end.
PHP:
$end = (!empty($row['end']) ? ((strlen($row['end']) < 5) ? "{$row['end']}-01-01 00:00:00" : $row['end']) : ($now->format("Y-m-d H:i:s")));

Ciao Hormus,

funziona perfettamente adesso ;) (non sicuro al 100%, devo testare, ma penso sia ok)

Grazie di cuore :)
 
Hormus ciao,
qualcosa non va,


Start 2011

End 2012

risultato: 11 months 30 days In The Business :rolleyes:
perche' non visualizza 1 year? :rolleyes:

sshot-1.png


codice

PHP:
$timezone = timezone_open('Europe/Moscow');
$now = date_create("now",$timezone);
$start = (strlen($row['start']) < 5) ? "{$row['start']}-01-01 00:00:00" : $row['start'];
$end = (!empty($row['end']) ? ((strlen($row['end']) < 5) ? "{$row['end']}-01-01 00:00:00" : $row['end']) : ($now->format("Y-m-d H:i:s")));
$diff = date_create($end, $timezone)->diff( date_create($start, $timezone) );


$testo = 'In The Business';

$year = $diff->y;
$mese = $diff->m;
$giorni = $diff->d;
if($year) {
echo '<font color="blue">' . $year . '</font>' . '&nbsp; years &nbsp;' . $testo ;
} else {
if($mese == 0 && $giorni == 0) {
echo 'anno corrente';
} elseif($mese) {
echo '<font color="red">' . $mese . '</font>' . '&nbsp; months &nbsp;' ;
}
if($giorni) {
echo '<font color="green">' . $giorni . '</font>' . '&nbsp; days &nbsp;' . $testo;
}
}
 
Ciao Alex_70 il codice è buono mentre la funzione diff non tanto.
Se si presenta un timezone "positivo" da inizio a fine mese non darà il risultato sperato poiché la funzione converte a UTC cioè a 0 il timezone. Anche se imposti UTC come timezone avrai solo l'illusione di calcolare una data poiché non verra applicato il DST o ST (in realtà il calcolo non viene applicato nemmeno al timezone "positivo" o "negativo").
Per rispondere al tuo problema ti faccio notare l'aritmetica DateTime il calcolo di + 1 month è riferito al mese corrente (+28 se febbraio non bisestile, +29 se febbraio bisestile, +30 se aprile, giugno , settembre, novembre altrimenti +31 se gennaio, marzo maggio, luglio, agosto, ottobre, dicembre) quindi con un'esempio start Europe/Rome 2011-01-01 00-00-00 viene trasformato in UTC 2010-12-31 23:00:00 ST +01:00 mentre end Europe/Rome 2012-01-01 00:00:00 viene trasformato in UTC 2011-12-31 23:00:00 ST +01:00.
Start 31 dicembre (+ 1 month 31 giorni), primo mese 31 gennaio (+ 1 month 31 giorni), secondo mese 28 febbraio (+ 1 month 31 giorni riferito a gennaio),
terzo mese 31 marzo (+ 1 month 31 giorni), quarto mese 30 aprile (+ 1 month 30 giorni), quinto mese 31 maggio (+ 1 month 31 giorni), sesto mese 30 giugno (+ 1 month 30 giorni), settimo mese 31 luglio (+ 1 month 31 giorni), ottavo mese 31 agosto (+ 1 month 31 giorni), nono mese 30 settembre (+ 1 month 30 giorni), decimo mese 31 ottobre (+ 1 month 31 giorni), undicesimo mese 30 novembre (+ 1 month 30 giorni), dodicesimo mese 31 dicembre (+ 1 month 31 giorni).
Voglio vedere questo bug puoi fare copia/incolla del risultato di uno script php in questo forum?
PHP:
header("Content-Type: text/plain");
$default1 = date_create("now");
$default2 = date_default_timezone_get();
$timezone = timezone_open('Europe/Rome');
$date_start = new DateTime('2011-01-01 00:00:00', $timezone);
$date_end = new DateTime('2012-01-01 00:00:00', $timezone);
var_dump($default1, $default2, ($date_start->getTimestamp()), ($date_end->getTimestamp()), ($date_start->diff($date_end)), $date_start, $date_end);
Che produce tale output:
Codice:
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2020-07-10 15:22:14.819623"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(11) "Europe/Rome"
}
string(11) "Europe/Rome"
int(1293836400)
int(1325372400)
object(DateInterval)#5 (16) {
  ["y"]=>
  int(1)
  ["m"]=>
  int(0)
  ["d"]=>
  int(0)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["f"]=>
  float(0)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  int(365)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(0)
}
object(DateTime)#3 (3) {
  ["date"]=>
  string(26) "2011-01-01 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(11) "Europe/Rome"
}
object(DateTime)#4 (3) {
  ["date"]=>
  string(26) "2012-01-01 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(11) "Europe/Rome"
}
Dovrebbe differire solamente l'orario e forse il tuo timezone iniziale... penso sia un problema di DST.
 

Discussioni simili