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:

marino51

Utente Attivo
28 Feb 2013
3.035
192
63
Lombardia
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
 

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
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;

?>
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
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
 

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
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
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
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));
 

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
Hormus non capisco come adattare il codice, non pensavo che un semplice script fosse cosi complicato, :(
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
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

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
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 :)
 

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
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;)
 

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
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
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
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

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
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
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
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

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
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 :)
 

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
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;
}
}
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
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
Autore Titolo Forum Risposte Data
gandalf1959 [risolto] Mostrare a video il risultato di una query con stesso anno e mesi diversi PHP 13
M Buon anno e sono appena arrivato ) Presentati al Forum 0
F [VENDO] Vendo account Netflix/Spotify 1 anno con Garanzia Altri Annunci 1
M (Vendo negozio online) Vuoi 1 milione € di vendite nel prossimo anno? Compravendita siti e domini 4
C [PHP] Estrapolare solo l'anno da una data di nascita inserita in un campo PHP 8
P Ciao a tutti e buon anno! Presentati al Forum 2
Sermatth72 Ciao e in bocca al lupo a Tutti per il Nuovo Anno!! Presentati al Forum 2
U Buon Natale e Buon Anno a Tutti Presentati al Forum 1
G [PHP] Selezionare OGGI anno precedente per query sql PHP 2
napuleone [PHP] Ho la settimana e l'anno cerco le date PHP 4
D Sito web dopo un anno sempre con poco traffico SEO e Posizionamento 4
S Buongiorno a tutti e Buon Anno. Presentati al Forum 1
JeanWolf Buon anno! Presentati al Forum 1
giuseppe_123 [PHP] Estrarre giorno mese e anno da una data PHP 2
S [PHP] anno nuovo in un gestionale PHP 3
U DBMS, anno e inventore Database 1
clodiny come sommare dei record raggruppandoli per anno MySQL 33
L Saluti e buon anno Presentati al Forum 0
K Buon anno Presentati al Forum 1
filippino Adsense: account in fase di revisione da 1 anno! Google AdSense 0
Gabriele Visioli Hosting 1&1 a 1 € per il primo anno Hosting 2
P Anno nel tag footer PHP 17
borgo italia select dell'anno perpetua Snippet PHP 0
C [risolto] quante settimane ci sono in un anno PHP 9
I Incremento giornaliero del numero di un giornale (es. 14 Maggio 2013 Numero 1 Anno 1) PHP 6
J Iscrizione d'inizio anno Presentati al Forum 2
E Buongiorno a tutti e Buon Anno! Presentati al Forum 2
P Buon anno 13........ Presentati al Forum 1
D Un saluto a tutti i membri del forum e Buon Anno Presentati al Forum 2
Shyson gif si sposta in basso se cambia l'anno Javascript 1
P problema con il countdown per la fine dell'anno e per natale Javascript 13
F Php Mysql - visualizzare record per anno con menu a tendina PHP 4
K Stored Procedure torno un rs con i valori che sono diminuiti del 5% in un anno MySQL 0
R [VENDO] spazio link a 5 euro /anno per siti di scuole di surf o surfcamp Vendere e Acquistare pubblicita' online 0
A funzione anno - 1 PHP 7
G [vendo] Offerta Link Su Pr3/200 Uniche 15 Euro/anno Vendere e Acquistare pubblicita' online 3
B update campo data (solo anno) MS Access 2
F [Vendo] Link 50 euro x 1 anno Vendere e Acquistare pubblicita' online 0
X Rinnovare iscritti anno per anno PHP 0
W Vendo 9 link Pr 4 per un anno Vendere e Acquistare pubblicita' online 3
G Offro link su homepage...pubblicizza il sito a 25,00€ all'anno Offerte e Richieste di scambio links 3
S Script - Giorni trascorsi dall'inizio dell'anno Javascript 6
4 Domini .info a 5€/anno - altri TLD a 9€/anno Domini 2
K Ass of the year 2005 ovvero il sedere + bello dell'anno Presenta il tuo Sito 0
R ADSL Gratis per un ANNO... Presenta il tuo Sito 0
U anno nuovo sito nuovo... Presenta il tuo Sito 2
S Italia on Net - Il tuo dominio a € 4,99 anno Domini 0
peppoweb Convegno: Accessibilità del Web, un anno di iniziative Discussioni Varie 0
P [PHP] Contare i mesi con timestamp. PHP 8
A GoDaddy mi addebita il rinnovo 2 mesi prima Discussioni Varie 2

Discussioni simili