2012-12-04 13 views
7

Sto lavorando su un'applicazione calendario. In questo utente da diversi fusi orari creare/visualizzare eventi. Sto pensando di seguire il metodo seguente per salvare il tempo dell'evento in UTC e visualizzarli nell'ora locale dell'utente. Nota: l'utente ha il proprio fuso orario preferito.fuso orario con gestione DST da parte di PHP

Per salvare evento ora di inizio come UTC timestamp:

$timezone = new DateTimeZone($user_timezone_name); 
$utcOffset = $timezone->getOffset(new DateTime($event_start_time_string_local)); 
$event_start_timestamp_local = maketime($event_start_time_string_local); 
//Now add/subtract $utcOffset to/from $event_start_timestamp_local to get event's start //time timestamp in UTC and save this result in DB. 

Per ottenere evento ora di inizio nel fuso orario dell'utente:

date_default_timezone_set($user_timezone_name); 
$eventTimeLocalTime = date("Y-m-d H:i:s", $event_start_timestamp_in_UTC); 

Dove:

user_timezone_name is user's timezone setting. 
event_start_time_string_local is event's start time string in local/civil time. 
event_start_timestamp_in_UTC is event's start time timestamp in UTC. 

Le mie domande:

  • Se le API PHP utilizzate in precedenza si prendono cura dell'ora legale per tutte le regioni?
  • L'ora legale si modifica in anni diversi, in che modo PHP ottiene informazioni su questo? dobbiamo aggiornare PHP? Se è così, dobbiamo aggiornare tutte o particolari le librerie PHP?

Riferimenti: - does-phps-date-default-timezone-set-adjust-to-daylight-saving - get-timezone-offset-for-a-given-location

risposta

14

Sei troppo overcomplicating questo. Per convertire tra due fusi orari utilizzando DateTime, fare questo:

date_default_timezone_set('Asia/Kolkata'); // YOUR timezone, of the server 

$date = new DateTime($input, new DateTimeZone('Asia/Tokyo')); // USER's timezone 
$date->setTimezone(new DateTimeZone('UTC')); 
echo $date->format('Y-m-d H:i:s'); 

Questo trasforma dal fuso orario locale di un utente a UTC. Per andare viceversa, per visualizzare l'ora nell'ora locale dell'utente, scambiare i due fusi orari.

Sì, PHP si occupa dell'ora legale. Le regole di conversione necessarie fanno parte dell'installazione di PHP. Puoi tenerli aggiornati aggiornando PHP o aggiornando il timezonedb: http://pecl.php.net/package/timezonedb.

+3

L'aggiornamento del timezonedb è un'attività regolare, necessaria più volte all'anno, perché ogni volta che un paese esegue una modifica riceve un aggiornamento - e ciò accade abbastanza frequentemente. – Sven

+0

Grazie mille, userò questo –

+3

Perché dobbiamo chiamare 'date_default_timezone_set (' Asia/Kolkata ')' all'inizio? –

4

Sì php api prende in considerazione l'ora legale. Il più delle volte è possibile eseguire in modo sicuro la conversione del tempo nel modo in cui l'inganno aveva mostrato. Il problema è che non è sempre possibile/fattibile o ha senso. Considera l'esempio seguente: in Polonia (nel 2013) il 27 ottobre alle 3:00 l'orologio viene spostato indietro di un'ora per passare all'ora standard (offset UTC + 01: 00) il 31 marzo alle 2am l'orologio viene regolato in avanti di 1 ora per passare all'estate ora (offset UTC + 02: 00). Vediamo ora come 'tempo reale' zecche in Grenwich/UTC e come la conversione da PHP dall'Europa/Varsavia a UTC funziona:

Europe/Warsaw time offset UTC     php2utc conversion php offset 
2013-10-27 01:00:00 +2 2013-10-26 23:00:00 2013-10-26 23:00:00 +2 
2013-10-27 01:30:00 +2 2013-10-26 23:30:00 2013-10-26 23:30:00 +2 
2013-10-27 02:00:00 +2 2013-10-27 00:00:00 2013-10-27 01:00:00 +1 * 
2013-10-27 02:30:00 +2 2013-10-27 00:30:00 2013-10-27 01:30:00 +1 * 
2013-10-27 02:59:00 +2 2013-10-27 00:59:00 2013-10-27 01:59:00 +1 * 
    3am -> 2am .....................................summer time changes to standard(winter) time @3am we subtract 1h so 3am becomes 2am 
2013-10-27 02:00:00 +1 2013-10-27 01:00:00 2013-10-27 01:00:00 +1 
2013-10-27 02:30:00 +1 2013-10-27 01:30:00 2013-10-27 01:30:00 +1 
2013-10-27 03:00:00 +1 2013-10-27 02:00:00 2013-10-27 02:00:00 +1 
2013-10-27 03:30:00 +1 2013-10-27 02:30:00 2013-10-27 02:30:00 +1 

Come si può vedere tra le 02:00-03:00 non c'è modo PHP può sapere ', che 'ora (da prima/dopo la regolazione) non è quindi possibile convertire in modo affidabile. Spero che questo aiuti qualcuno nelle sue riflessioni ;-)

+0

Questa è una buona presa. –