2011-02-01 23 views
7

Come dovrei prendere una data memorizzata, come 2011-01-30 18:23:49, e regolarla su un fuso orario prescelto? Esiste un modo semplice come la semplice definizione del fuso orario per abbreviazione o l'aggiunta/la sottrazione della quantità di ore? Fondamentalmente voglio che gli utenti siano in grado di scegliere il loro fuso orario e questa data di default sia regolata per adattarsi alla loro.regolare il fuso orario

+1

possibile duplicato di [Regolazione fuso orario in PHP con DateTime/DateTimeZone] (http://stackoverflow.com/questions/1445087/adjusting-time-zone-in-php-with-datetime-datetimezone) –

risposta

7
  1. Avere l'utente scegliere il proprio fuso orario

  2. usare quel nome zona o compensati con date_default_timezone_set per impostare il fuso orario predefinito utilizzato in funzioni di data per tutto il resto della esecuzione dello script.

  3. Usa date('Z') per ottenere che il fuso orario è compensato da GMT in secondi

  4. Convertire la data immagazzinata ad una data con strtotime - timestamp UNIX sono sempre GMT, in modo da ora avete il tempo in GMT.

  5. Aggiungere l'offset dal passaggio 3 per convertire tale fuso orario nel fuso orario dell'utente.

  6. Utilizzare nuovamente date per formattare il timestamp come una stringa nel formato di visualizzazione desiderato.

Esempio:

$user_timezone = 'America/Los_Angeles'; 
$stored_time = '2011-01-30 18:23:49'; 

date_default_timezone_set($user_timezone); 
$timestamp = strtotime($stored_time); 
$local_timestamp = $timestamp + date('Z'); 
$local_date = date('Y-m-d H:i:s', $local_timestamp); 

echo $local_date; 
0

Qui viene la mia soluzione. L'ho provato con America/Los_Angeles come fuso orario dei server e il mio fuso orario come utenti. Presumo che il tempo sia memorizzato utilizzando il fuso orario dei server.

<?php 
// My (user) timezone 
$user_timezone = 'Europe/Berlin'; 

// Server timezone 
$stored_timezone = 'America/Los_Angeles'; 

// Date/Time stored in your DB, using timezone of the server (yours, that is) 
$stored_datetime = '2011-01-29 22:40:00'; // this is the current time in L.A. 

// Setting default to servers timezone if not done before 
date_default_timezone_set($stored_timezone); 

// converting to unix timestamp 
$stored_timestamp = strtotime($stored_datetime); 

// setting default to users timezone 
date_default_timezone_set($user_timezone); 

// converting to timestamp 
$user_datetime = date('Y-m-d H:i:s', $stored_timestamp); 

// setting default back to servers timezone 
date_default_timezone_set($stored_timezone); 

echo $user_datetime; // output is my current time