Discussione:
'date', timestamp e fuso orario
(troppo vecchio per rispondere)
stupormundi
2004-04-04 22:23:38 UTC
Permalink
Ho un problema con la funzione 'date' in un forum realizzato in php.
L'ora del server sul quale risiede il forum e' sincronizzata sull'UTC,
dunque risulta attualmente 2 ore indietro rispetto all'ora italiana.

Ogni evento del forum viene associato ad un timestamp, che e'
memorizzato in un array, per poi essere da li' ripreso, manipolato e
visualizzato ogni qual volta ce n'e' bisogno.
La mia intenzione e' di intervenire NON nella fase di generazione del
timestamp di ogni evento MA nella fase di visualizzazione (perche' mi
sono incaponito cosi' :-)).

Prendiamo per esempio la porzione di codice che formatta e visualizza
data e ora dell'invio del piu' recente messaggio in un thread:

// $lastposton=date($dateformat,$lastpostarray[1]);

// echo "$lastposton";


Io ho 'risolto' sostituendolo con questo, in modo che ogni orario sia
portato avanti di 2 ore, tramite una manipolazione del timestamp con la
funzione 'substr_replace':

// $timezone=2;

// $lastposton=substr_replace(date($dateformat,$lastpostarray[1]),
substr(date($dateformat,$lastpostarray[1]), 11, 2)+$timezone, 11, 2);

// echo "$lastposton";


Come e' facile intuire, la rozzezza di questo metodo crea dei problemi
dalle ore 0.00 (22.00 UTC) alle ore 1.59 (23.59 UTC), in quanto la data
rimane indietro di un giorno, e un orario tipo le 1.30 viene
visualizzato come 25.30 :-)

Dunque, la mia domanda e': c'e' un modo diverso e migliore per risolvere
questo problema del fuso orario (+ ora legale) intervenendo SOLO sulla
porzione di codice che ho riportato?

Suppongo di no, ma visto che non sono un programmatore ne' conosco il
php (vado 'a senso', guardando su google e sul manuale), sono qui a
chiederlo a voi.


Riformulo in maniera piu' semplice e concludo.
Preso in considerazione questo codice:
// $lastposton=date($dateformat,$lastpostarray[1]);

voglio che, **partendo dal timestamp $lastpostarray[1]**, la data
risultante sia aumentata di 2 'ore' (non di 2 unita' aritmetiche, come
ho fatto io).

Ho visto che esiste una classe 'date' su PEAR, ma non mi sembra che
possa manipolare i timestamp (anzi e' nata apposta affinche' vengano
superati), mentre io voglio operare proprio su questi.



Grazie.
Ciao.
-
Gianni
Setec Astronomy
2004-04-05 07:35:38 UTC
Permalink
Post by stupormundi
Ogni evento del forum viene associato ad un timestamp, che e'
memorizzato in un array, per poi essere da li' ripreso, manipolato e
visualizzato ogni qual volta ce n'e' bisogno. La mia intenzione e'
di intervenire NON nella fase di generazione del timestamp di ogni
evento MA nella fase di visualizzazione (perche' mi sono incaponito
cosi' :-)).
// $lastposton=date($dateformat,$lastpostarray[1]);
Soluzione in 1 riga:

<?php
$timezone = 2; // +2, -2 etc.
$timestamp = "20040104083015"; // YYYYMMDDHHMMSS format
print (date ("D M j G:i:s T Y", mktime (substr ($timestamp, 8,2),
substr ($timestamp, 10,2), substr ($timestamp, 12,2), substr
($timestamp, 4,2), ((int)(substr ($timestamp, 5,2)) + $timezone),
substr ($timestamp, 0,4))));
?>

Ovviamente se il timestamp ha un formato differente e' sufficiente
variare i parametri di substr.
--
I am what I am, I do what I can
Vuoi supportarmi? http://url.repository.biz/go/3E
Votami! http://www.phpclasses.org/vote.html
L'uomo, conscio di sbagliare, persevera.
Loading...