Newsgroup: it.comp.www.php
Titolo: Problema con timestamp

Ciao a tutti.
Ho un problema molto singolare con 2 timestamp.
Il primo timestamp (1111881600) mi restituisce correttamente la data e
l'ora giusta (27-03-2005 01:00:00) ma, se sommo 3600 secondi (1 ora) o
sommo 1 ora tramite
strtotime("+1 hour, 1111881600)
lui non mi da (come dovrebbe fare) il
27-03-2005 02:00:00 ma
27-03-2005 03:00:00
Dove sono finite le 2 di notte?
Inoltre, ho lo stesso problema anche qui:
timestamp: 1130630400 (30-10-2005 02:00:00)
Sommando 3600 o +1hour ottengo un timestamp diverso:
1130634000 ma che corrisponde sempre alla stessa ora: 30-10-2005
02:00:00
Qualche bug?
Non so da dove cominciare a guardare....

 Dove sono finite le 2 di notte?
ora solare / ora legale?
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

> ora solare / ora legale?
:-D
molte volte (come questa) la soluzione piu semplice e banale è la
migliore...
Si è proprio quello il problema.
Si può disattivare temporaneamente nei calcoli delle date?
devo fare una semplice somma e non mi importa dell'ora legale..
l'una di notte + 3600 DEVE fare SEMPRE le 2 di notte.
Legale o solare che sia.

 Si puņ disattivare temporaneamente nei calcoli delle date?
Non saprei proprio, comunque ha una sua logica che implementi il cambio
di ora in automatico.
-- 
I am what I am, I do what I can


 
lavora con gli orari in gmt (o utc che dir si voglia) e poi aggiungere 
3600 per passare all'ora solare italiana

 Si può disattivare temporaneamente nei calcoli delle date?
Puoi anche gestire l'orario in base al risultato di
date("I");

 date("I");
Non ti seguo.
Io ho un file di testo con 365 righe e per ogni riga ci sono 24 valori
separati da ";" che vanno dalle 00 alle 23
per ogni valore devo creare il relativo timestamp partendo dal 1
gennaio 2005 alle 00:00:00 e arrivare al 31 dicembre 2005 alle 23:00:00
il problema è che quando c'è l'ora solare, lui mi salta un ora e
quando l'ora solare viene tolta lui mi ripete la stessa ora.
Adesso sento con chi mi ha commissionato il lavoro su come gestire
l'ora legale.

 Non ti seguo.
il mio voleva solo essere un suggerimento.
cmq se giochi con i vari parametri della funzione date() riesci a 
risolvere il tuo problema. Chiaro che devi cmq gestire le ore legali in 
maniera idonea rispetto a ciň che vuoi ottenere.

 maniera idonea rispetto a ciò che vuoi ottenere.
Sono riuscito ad escludere la timezone nelle date del php...le ho
salvate su mysql tutte come GMT.
Il problema ora è come dire a mysql di NON usare la sua timezone ma
ragionare in GMT.
Ho letto che si può fare solo lato server. io però devo farlo tramite
uno script (non posso cambiare tutto a livello server). Sommando o
sottraendo +2 ore da ogni orario non va bene in quanto il +2 da sommare
o sottrarre cambia in base all'ora legale...
Qualche idea?

 
Creare uno script php che guardi in che timezone si trova il server e
aggiunge/sottrae di conseguenza il tempo?
Altrimenti tra le funzioni di MySql probabilmente qualcosa ci sarà...
-- 
Stéphane Bisinger
Webmas... well...

 Altrimenti tra le funzioni di MySql probabilmente qualcosa ci sarà...
Tra le funzioni di mysql c'è la possibilità di sottrarre e sommare le
timezone ma è piuttosto macchinoso. bisogna sapere la timezone
attuale.
e in italia cambia in base all'ora legale +1 o +2 rispetto a
greenwitch.
Devo fare una cosa totalmente automatica.
Comunque al momento ho risolto, non so come ma ho risolto. La timezone
è la GMT e non ho cambiato nulla su mysql.

 greenwitch.
Le funzioni che ritornano la timezone attuale ti danno +1 o +2 a seconda
del periodo dell'anno... Visto che dipende dall'ora del sistema, la
quale tiene traccia automaticamente di questi cambiamenti, a meno di
impostazioni diverse (ad esempio se il server è impostato su GMT)


 impostazioni diverse (ad esempio se il server è impostato su GMT)
Testando piu a fondo lo script ho scoperto che non funziona
assolutamente nulla. Non riesco a capire come fare.
Allora parto dall'inzio.
Ho un file chiamato
prova.txt
al suo interno sono presenti 365 righe, ogni riga ha 24 colonne
separate da ;.
Esempio
F1;F2;F3;F1;F4..............F4
F2;F4;F4;F3;F2..............F1
il valore max di F# è F4.
Ora ho bisogno di inserire questi dati in un DB mysql nel formato
TIMESTAMP, FASCIA
fascia equivale alla F in quel dato momento mentre il timestamp
equivale al timestamp della data in quel dato momento.
Dato che sono 24 fasce per giorno, la prima colonna della prima riga
del file equivale a
1 gennaio 2005 00:00:00
la seconda colonna:
1 gennaio 2005 01:00:00
l'ultima riga, ultima colonna
31 dicembre 2005 23:00:00
Detto ciò, l'inserimento lo faccio correttamente usando gmdate e
gmmktime
evitando cosi l'ora legale e l'ora solare italiana.
Fin qui tutto ok.
Il problema vine nelle visualizzazione dove devo abbinare determinati
orari ad esempio
12:34:00 alla relativa fascia oraria di quel giorno cioè 12:00:00 e
leggere il rispettivo valore (esempio F3)
La query è la seguente:
SELECT timestamp_utente, timestamp_fascia, fascia
FROM fasce_orarie
WHERE FROM_UNIXTIME(timestamp_utente, '%d %m %Y %H')) = '12 09 2005 12'
il problema è che mysql lavora con la timezone (che da quanto ho
capito non posso disattivare se no lato server) e php ha le date in
GMT.
Mettendo le date php NON in GMT ma in ora locale, viene fuori il
problema dell'ora legale.
Mettendo infine le date php in GMT e mysql lasciarlo cosi come è,
mysql esegue delle query su date che poi PHP mi va a convertire in GMT
quindi leggo dei risultati che sono 2 ore precedenti ad esempio le
00:00:00 del 20 settembre con mysql viene preso correttamente grazie
alla query ma poi php me lo converte in 19 settembre 2005 22:00:00 (2
ore in meno)

 
Non è che per visualizzare le date usi date() invece di gmdate() ?
O usi sempre date() + mktime(), o usi sempre gmdate() e gmmktime().


 minori della 4.1, maggiori o uguali alla 4.1, maggiori o uguali alla 5.0.
Timestamp utente contiene il timestamp (giorno mese anno ora minuti) di
ogni rilevazione (4 per ora, quindi 1 ogni quarto d'ora).
Ora ogni timestamp utente deve essere abbinato alla relativa fascia
oraria.
Il timestamp utente però ha i 4 quarti d'ora di conseguenza tutti e 4
i quarti d'ora corrispondono alla stessa fascia oraria. esempio
Fascia oraria:
26 settembre 2005 15:00 - F4
Orari utente:
26 settembre 2006 15:00 - F4
26 settembre 2006 15:15 - F4
26 settembre 2006 15:30 - F4
26 settembre 2006 15:45 - F4
quindi la query dovrebbe essere (forse ho dimenticato di dire che sono
e DEVONO essere 2 tabelle, una con le fasce e i timestamp orari e 1 con
i dati e i timestamp utente in minuti)
SELECT *
FROM fasce, utente
WHERE FROM_UNIXTIME(utente.timestamp,"%m") = "09"
AND FROM_UNIXTIME(utente.timestamp, "%d%m%Y%H") =
FROM_UNIXTIME(fasce.timestamp, "%d%m%Y%H")
in questo modo limito i record al mese di settembre (09) e abbino gli
orari degli utenti con gli orari delle fasce.
Il problema è che il giorno delle fasce è scritto in locale e quello
degli utenti in GMT (oppure viceversa, oppure in altri modi e non
capisco come).
Ho SEMPRE usato "date + mktime" oppure "gmdate + gmmktime" e non li ho
mai mischiati.
Ho fatto anche mezzi controlli sull'ora legale (date(I)) ma non cambia
nulla.
le 2 di notte del 27 marzo non esistono..in qualunque modo lo scrivo
php mi mette le 3 di notte.
se faccio in gmt, le 2 di notte esistono, ma poi mysql le converte alle
3 di notte oppure sfasa i risultati di qualche ora (1 o 2)

A..............uso i timestamp unix no mysql.
Forse usando il mysql evito il casino dell'ora legale/solare? è
l'unica prova che non ho fatto.
Teoricamente si perchè posso usarlo come stringa testuale
(AAAAMMGGHHMMSS) anziche timestamp che viene convertito in automatico
da PHP..
domani provo


La stringa di testo falla preparare da PHP, non da una funzione di
MySQL, almeno sai esattamente come viene fuori...


 MySQL, almeno sai esattamente come viene fuori...
Provo proprio adesso.
Se butta male ho un altra idea:
Timestamp con il giorno (27 settembre 2005) + campo time di mysql nel
formato HH:MM:SS
cosi confronto
FROM_UNIXTIME(timestamp, "%m") = "09" AND HOURS(orari) = fasce_orarie