Anno mesi giorni

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
Ciao Hormus,

avevo impostato il timezone con il mio, ma a quanto pare non andava bene

PHP:
$timezone = timezone_open('Europe/Moscow');
reimpostato cosi mi segna correttamente il risultato

PHP:
$timezone = timezone_open('Europe/Moscow');
questo e' il risultato dello script con timezone Europe/Moscow

PHP:
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2020-07-10 16:50:40.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Moscow"
}
string(13) "Europe/Moscow"
int(1293829200)
int(1325361600)
object(DateInterval)#5 (15) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(11)
  ["d"]=>
  int(29)
  ["h"]=>
  int(23)
  ["i"]=>
  int(0)
  ["s"]=>
  int(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(13) "Europe/Moscow"
}
object(DateTime)#4 (3) {
  ["date"]=>
  string(26) "2012-01-01 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Moscow"
}
e questo con timezone Europe/Rome

PHP:
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2020-07-10 16:52:46.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Moscow"
}
string(13) "Europe/Moscow"
int(1293836400)
int(1325372400)
object(DateInterval)#5 (15) {
  ["y"]=>
  int(1)
  ["m"]=>
  int(0)
  ["d"]=>
  int(0)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(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"
}
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Ti spiego il perché ti manca un'ora con il timezone Europe/Moscow questo fuso orario è da sempre stato in cambiamento tra DST e ST nel 2010-03-28 02:00:00 ha adottato DST e nel 2010-10-31 03:00:00 ST mentre nel 2011-03-27 02:00:00 +4UTC tutto l'anno.
Quindi la funzione diff trasforma in UTC internamente 2010-12-31 21:00:00 (start) UTC e 2011-12-31 20:00:00 (end) poiché il calcolo viene effettuato indistintamente in UTC ti manca un'ora per un anno.
Mentre Europe/Rome ha sempre stabile DST e ST.
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
In teoria per la condivisione di date o specifichi anche le ore come dice la iana oppure usi UTC e poi converti il risultato finale nel tuo timezone.. UTC non cambia mai ha sempre offset 0.
Tanto (attualmente) diff non calcola comunque DST ST.
 
  • Like
Reactions: Alex_70

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
Riprendo il thread,
dunque, attualmente lo script calcola la differenza tra start, end e l'anno partendo dal 1 Gennaio , pero' il risultato non e' tanto preciso, siccome io dispongo di altri dati avevo pensato di integrarli
Esempio:
qui viene calcolato il tempo tra start e il 1 Gennaio 2020
sshot-1.png

siccome il debutto e in realta 2020.07.30 si potrebbe determinare la data esatta,

sshot-2.png


Tabella actor
start
end

Tabella film
year
release_data

lo script dovrebbe controllare se il campo start e year corrispondono e poi calcolare la differenza tra start e release_data

PHP:
<?php

// code In The Business calcola i mesi e giorni trascorsi in caso l'anno e' attuale, esempio: 2020 + update calcolo anno
// by Hormus Mr. Webmaster Forum 2020.07.10


$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['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;
}
}     
    

?>     

<?php
if(!empty($row['start'])) { echo "<p class=\"bioheading\">Start</p><p  class=\"biodata\">" . $row['start'] . "</p>"; }

?>
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Attualmente la tua colonna start contiene esattamente quattro cifre numeriche contenenti l'anno e quindi lo resetto al primo gennaio del giorno uno invece vuoi che abbino l'anno al mese e giorno corrente? Difficilmente se start è di quattro cifre sarà uguale a relase_data 10 cifre (incluso i due punti) per lo più potrebbe condividere lo stesso anno ma non il resto.
Ragionevolmente per me si dovrebbe effettuare la differenza di relase_date con end indistintamente da start (poiché quest'ultimo dovrebbe già condividere l'anno con relase_date altrimenti i dati nel database sono errati se non esiste una corretta correlazione tra i due dati data_relase e start).
EDIT: Calcolo differenza temporale se presente da relase_date altrimenti da start e in entrambi i casi a $end, restituisce la differenza: solo l'anno o l'anno corrente o mesi e giorni oppure giorni in entrambi i casi è presente $testo.
PHP:
<?php
error_reporting(-1);

// code In The Business calcola i mesi e giorni trascorsi in caso l'anno e' attuale, esempio: 2020 + update calcolo anno
// by Hormus Mr. Webmaster Forum 2020.07.10

$out_start = $row['start'];
if(!empty($row['relase_date'])) {
    $out_start = $row['relase_date'];
}
$timezone = timezone_open("UTC");
$now = date_create("now",$timezone);
$start = (!empty($row['relase_date']) ? strtr($row['relase_date'], '.', '-') : ((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 ;
} elseif($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;';
        }
    echo $testo;
} else {
    echo '<font color="green">' . $giorni . '</font>' . '&nbsp; days &nbsp;' . $testo;
}
    

?>

<?php
echo "<p class=\"bioheading\">Start</p><p  class=\"biodata\">" . $out_start . "</p>";

?>
 
Ultima modifica:

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
Ciao Hormus


ho sbagliato a scrivere il nome del campo, in realta' e' release_data
confronto tra start (tabella actor) e year ( tabella film) e poi calcolare release_data (tabella film) perche' ci potrebbe essere start ma nessun film inserito

ho problema con la query, tutti i dati dopo start non vengono visualizzati

release_data si trova su tabella film e il codice viene eseguito invece e su tabella actor


PHP:
<?php            


require_once("connetti.php");



$actor_id = $_GET['id'];

$query = "SELECT
film.release_data as release_data,
actor.start as start
FROM film_actor
INNER JOIN film ON film_actor.film_id = film.film_id
INNER JOIN actor ON film_actor.actor_id = actor.actor_id
WHERE film_actor.actor_id = " . $actor_id;

$result = mysql_query( $query );
if (!$result)
die("mySQL error: ". mysql_error());
while( $row = mysql_fetch_array( $result ) ) : ?>  



<?php
error_reporting(-1);

// code In The Business calcola i mesi e giorni trascorsi in caso l'anno e' attuale, esempio: 2020 + update calcolo anno
// by Hormus Mr. Webmaster Forum 2020.07.10

$out_start = $row['start'];
if(!empty($row['relase_data'])) {
    $out_start = $row['relase_data'];
}
$timezone = timezone_open("UTC");
$now = date_create("now",$timezone);
$start = (!empty($row['relase_data']) ? strtr($row['relase_data'], '.', '-') : ((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 ;
} elseif($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;';
        }
    echo $testo;
} else {
    echo '<font color="green">' . $giorni . '</font>' . '&nbsp; days &nbsp;' . $testo;
}
   

?>

<? endwhile; ?>  


<?php
echo "<p class=\"bioheading\">Start</p><p  class=\"biodata\">" . $out_start . "</p>";

?>
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Beh l'alias effettivamente deve essere differente dal nome di colonna ma senza alias soprattutto se tale colonna è presente in altre tabelle mysql effettua una query errata.
Boh sostituisci in questo modo.
PHP:
//Recupera i film di un attore
$query = "SELECT
film.release_data as release_data, film.year as year, actor.start as start
FROM film_actor
INNER JOIN film ON film.film_id = film_actor.film_id
INNER JOIN actor ON actor.actor_id = film_actor.actor_id
WHERE film_actor.actor_id = " . $actor_id . ' AND film_actor.film_id IS NOT NULL';
Ovviamente sostituisci $row['relase_data'] con $row['release_data'].
Nel caso di dubbio usa anche var_dump($row); così leggi ogni array duplicato (associativo e numerico perché stai usando mysql_fetch_array).
Quindi dal momento che stai calcolando release_date non dovrebbe essere al momento di oggi? Te lo spiego con una domanda.
Quant'è vecchio questo film?
Mentre con start sarebbe: differenza anni carriera di un attore e il vero end.
Con year , anno uscita del film.
Alex_70 se esiste il film quest'ultimo dato year, release_data è sempre presente?
 
Ultima modifica:

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
Buongiorno Hormus
ho inserito il codice modificato e funziona, il problema e che dopo la query non vengono visualizzati i dati in avanti della tabella actor

CON QUERY NUOVA AGGIUNTIVA

Schermata 2020-07-31 alle 09.23.22-fullpage.png


come noterai viene conteggiato 1 days in The Business

ma poi i dati aggiuntivi si interrompono (Vital Stats, Link, Gallery ec..) per actor,

la query inizia dalla sinistra con Alex e scende giu e poi passare sulla destra

questo e' lo schema logico delle query (sono 2, 1 per tabella actor e 1 per film)

SENZA QUERY NUOVA
Schermata 2020-07-31 alle 09.09.59-fullpage.png


codice

PHP:
<?php           


require_once("connetti.php");



$actor_id = $_GET['id'];



//Recupera i film di un attore
$query = "SELECT
film.release_data as release_data, film.year as year, actor.start as start
FROM film_actor
INNER JOIN film ON film.film_id = film_actor.film_id
INNER JOIN actor ON actor.actor_id = film_actor.actor_id
WHERE film_actor.actor_id = " . $actor_id . ' AND film_actor.film_id IS NOT NULL';



$result = mysql_query( $query );
if (!$result)
die("mySQL error: ". mysql_error());
while( $row = mysql_fetch_array( $result ) ) : ?> 



<?php
error_reporting(-1);

// code In The Business calcola i mesi e giorni trascorsi in caso l'anno e' attuale, esempio: 2020 + update calcolo anno
// by Hormus Mr. Webmaster Forum 2020.07.10

$out_start = $row['start'];
if(!empty($row['release_data'])) {
    $out_start = $row['release_data'];
}
$timezone = timezone_open("UTC");
$now = date_create("now",$timezone);
$start = (!empty($row['release_data']) ? strtr($row['release_data'], '.', '-') : ((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 ;
} elseif($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;';
        }
    echo $testo;
} else {
    echo '<font color="green">' . $giorni . '</font>' . '&nbsp; days &nbsp;' . $testo;
}
  

?>

<? endwhile; ?>
 
Ultima modifica:

Hormus

Utente Attivo
26 Giu 2020
83
10
8
È corretto non visualizzare i dati in avanti poiché stai recuperando solo il recordset start, year e release_data e unicamente se film_actor.film_id avrà il valore diverso da vuoto e film_actor.actor_id = id attore il difficile è individuare perché questo interferisce con altre query.
Praticamente la query di un attore è senza la clausola AND film_actor.film_id IS NOT NULL mentre quella da me fornita è film di un attore.
Ciò che mi sorprende è perché la differenza temporale abbia due risultati diversi dal momento che $row['release_data'] non esiste :/ ma probabilmente calcolo start con $end (può essere fine carriera oppure la data temporale riferita al momento) di film_actor nel secondo esempio.
 

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
la query che visualizza i dati actor e messa a inizio script, l'altra query nuova e' a meta, ma se inizia e finisce con
<? endwhile; ?> perche' poi non continua quella precedente?
come risolvere?
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Nei due loop while stai utilizzando la stessa variabile $row? Beh al secondo loop $row sarà valore null quando finisce literazione e quindi termina anche il primo loop poiché è null.
Identico discorso anche per il primo loop verso il secondo.
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Prova cambiando $row del secondo loop in $rows e ovviamente le variabili start, release_data e end dovranno anch'esse usare $rows.
 

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
ho cambiato la variabile, adesso visualizzo i dati successivi actor ma lo script non viene eseguito piu come prima

questo e' il risultato

sshot-1.png


PHP:
<?php             

 
require_once("connetti.php");


 
$actor_id = $_GET['id'];



//Recupera i film di un attore
$query = "SELECT
film.release_data as release_data,
film.year as year,
actor.start as start,
actor.end as end
FROM film_actor
INNER JOIN film ON film.film_id = film_actor.film_id
INNER JOIN actor ON actor.actor_id = film_actor.actor_id
WHERE film_actor.actor_id = " . $actor_id . ' AND film_actor.film_id IS NOT NULL';



$result = mysql_query( $query );
if (!$result)
 die("mySQL error: ". mysql_error()); 
while( $rows = mysql_fetch_array( $result ) ) : ?>   



<?php
error_reporting(-1);

// code In The Business calcola i mesi e giorni trascorsi in caso l'anno e' attuale, esempio: 2020 + update calcolo anno
// by Hormus Mr. Webmaster Forum 2020.07.10

$out_start = $rows['start'];
if(!empty($rows['relase_data'])) {
    $out_start = $rows['relase_data'];
}
$timezone = timezone_open("UTC");
$now = date_create("now",$timezone);
$start = (!empty($rows['relase_data']) ? strtr($rows['relase_data'], '.', '-') : ((strlen($rows['start']) < 5) ? "{$rows['start']}-01-01 00:00:00" : $rows['start']));
$end = (!empty($rows['end']) ? ((strlen($rows['end']) < 5) ? "{$rows['end']}-01-01 00:00:00" : $rows['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 ;
} elseif($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;';
        }
    echo $testo;
} else {
    echo '<font color="green">' . $giorni . '</font>' . '&nbsp; days &nbsp;' . $testo;
}
    

?>

<? endwhile; ?>
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Cambia nel secondo loop anche $result in $results.
Se puoi postare l'intero codice lo guardo e eventualmente lo trasformo in query senza buffer dal momento che mysql di default è bufferizzata.
 

Alex_70

Utente Attivo
13 Nov 2018
371
14
18
HELL
niente, non va, cambiato $result in $results ,
non posso postare tutto il codice, 1900 righe e 2 anni di lavoro solo per actor
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Prova a cambiare gli alias in un nome unico su ogni query e relativa variabile.
altresì usa var_dump su ogni result.