Impostazione di un fuso orario in PHP. Fuso orario della data: imposta il fuso orario in PHP e MySQL Dater: determina il fuso orario, localizza e formatta l'ora in PHP

Se nel processo di gestione dell'hosting virtuale è necessario modificare il fuso orario predefinito, questa azione può essere facilmente eseguita in diversi passaggi, descritti di seguito.

Modifica del fuso orario tramite Seleziona versione PHP

Per cambiare il fuso orario vai a cPanel -> Software -> Seleziona la versione PHP -> Passa alle opzioni PHP.

Il passo successivo è modificare il valore della variabile data.fusoorario al fuso orario di cui hai bisogno. Puoi trovare l'elenco dei fusi orari disponibili nell'ultimo paragrafo dell'articolo.

Dopo aver apportato le modifiche necessarie, è importante fare clic sul pulsante "Salvare le modifiche", che si trova in fondo alla pagina Selettore PHP.

Per garantire che sia stato applicato il valore del fuso orario specificato, è possibile utilizzare la funzione PHP phpinfo(), che visualizza informazioni su tutti i parametri php installati. Per fare ciò, crea in public_html fare clic sul pulsante "File" nel menu del dispatcher.

  • Nel campo Nuovo nome file indicare, ad esempio, phpinfo.php quindi fare clic sul pulsante Crea nuovo file.

  • Di conseguenza, il file con il nome specificato apparirà nell'elenco degli altri sull'hosting.
  • Successivamente, è necessario aprire questo file per la modifica. Per fare ciò, fare clic con il tasto sinistro del mouse sul file desiderato, quindi nel menu Gestione fare clic sul pulsante Modifica.
  • Nel modulo che appare, lascia tutti i parametri predefiniti e fai clic sul pulsante Modificare, per aprire un editor di testo.

  • Nella finestra che si apre è necessario inserire il seguente codice:

Successivamente, salva il file e aprilo nel tuo browser. In questo esempio, il file sarà disponibile all'indirizzo:

http://dominio_principale/phpinfo.php

Nella pagina che si apre, individua la sezione data, che conterrà una tabella con il valore del fuso orario corrente. In questo caso viene visualizzata la zona sopra Europa/Kiev.

Questo completa il processo di modifica del fuso orario.

Elenco di fusi orari per configurare il fuso orario

Inoltre, alleghiamo di seguito un elenco di possibili valori di fuso orario:

Africa/Cairo Africa/Casablanca Africa/Harare Africa/Monrovia Africa/Nairobi America/Bogotà America/Buenos_Aires America/Caracas America/Chihuahua America/La_Paz America/Lima America/Mazatlan America/Messico_City America/Monterrey America/Santiago America/Tijuana Asia/ Almaty Asia/Baghdad Asia/Baku Asia/Bangkok Asia/Chongqing Asia/Dacca Asia/Hong_Kong Asia/Irkutsk Asia/Giakarta Asia/Gerusalemme Asia/Kabul Asia/Karachi Asia/Kathmandu Asia/Calcutta Asia/Krasnoyarsk Asia/Kuala_Lumpur Asia/Kuwait Asia /Magadan Asia/Mascate Asia/Novosibirsk Asia/Riad Asia/Seul Asia/Singapore Asia/Taipei Asia/Tashkent Asia/Tbilisi Asia/Teheran Asia/Tokyo Asia/Ulan Bator Asia/Urumqi Asia/Vladivostok Asia/Yakutsk Asia/Ekaterinburg Asia/Erevan Atlantico/Azzorre Atlantico/Capo_Verde Atlantico/Stanley Australia/Adelaide Australia/Brisbane Australia/Canberra Australia/Darwin Australia/Hobart Australia/Melbourne Australia/Perth Australia/Sydney Canada/Atlantico Canada/Terranova Canada/Saskatchewan Europa/Amsterdam Europa/Atene Europa/ Belgrado Europa/Berlino Europa/Bratislava Europa/Bruxelles Europa/Bucarest Europa/Budapest Europa/Copenaghen Europa/Dublino Europa/Helsinki Europa/Istanbul Europa/Kiev Europa/Lisbona Europa/Lubiana Europa/Londra Europa/Madrid Europa/Minsk Europa/Mosca Europa /Parigi Europa/Praga Europa/Riga Europa/Roma Europa/Sarajevo Europa/Skopje Europa/Sofia Europa/Stoccolma Europa/Tallinn Europa/Vienna Europa/Vilnius Europa/Volgograd Europa/Varsavia Europa/Zagabria Groenlandia Pacifico/Auckland Pacifico/Fiji Pacifico/ Guam Pacifico/Midway Pacifico/Port_Moresby Stati Uniti/Alaska Stati Uniti/Arizona Stati Uniti/Stati Uniti centrali/Stati Uniti orientali/Indiana orientale Stati Uniti/Hawaii Stati Uniti/Montagne Stati Uniti/Pacifico Stati Uniti/Samoa

Vuoi un nuovo nome per il tuo sito web? Disponibile da noi

A volte si verifica una situazione in cui l'ora corrente sul server non corrisponde al tuo fuso orario attuale o al fuso orario della regione a cui è rivolto il tuo sito.

Per essere chiari, lascia che te lo ricordi: la Russia è geograficamente molto grande e non tutti hanno bisogno che i propri siti “vivano” secondo l'ora di Mosca. Ad esempio, gli Urali, la Siberia, l'Estremo Oriente, ecc.

I server dei provider di hosting russi più famosi si trovano sui siti tecnologici di Mosca e San Pietroburgo e, di default, sono configurati, ovviamente, per il fuso orario di Mosca. Il server non può adattarsi automaticamente alla posizione corrente e regolare l'orologio del sistema. Pertanto, il funzionamento delle funzioni di data e ora sul sito potrebbe non essere del tutto corretto. Naturalmente ora non stiamo parlando di CMS, in cui la regolazione del fuso orario è solitamente presente direttamente nell'interfaccia dell'amministratore.

Prima di tutto, controlla lo stato corrente utilizzando il codice PHP:

echo ini_get("date.timezone");

Va bene se hai il tuo server e hai accesso a php.ini, dove puoi impostare il fuso orario desiderato e dimenticarlo. Ad esempio, in questo modo:

Date.timezone = Europa/Mosca

Tuttavia, se il server ospita più progetti che devono supportare fusi orari diversi, è meglio non farlo. In questo caso sarebbe più corretto impostare i fusi orari solo per progetti con lo stesso fuso orario.

Impostazione di un fuso orario sull'hosting condiviso

Sull'hosting condiviso, molto spesso non è possibile accedere alle configurazioni del server. Pertanto, prima di tutto, prova a impostare il fuso orario utilizzando .htaccess. Basta trovare o creare un file .htaccess nella root del tuo sito e aggiungervi la seguente riga:

Php_value date.timezone "Europa/Mosca"

Se il metodo non funziona, utilizzeremo la funzione date_default_timezone_set(), che imposta il fuso orario predefinito per tutte le funzioni di data e ora. Per fare ciò, devi solo aggiungere la seguente riga da qualche parte all'inizio dello script:

Date_default_timezone_set("Europa/Mosca");

Naturalmente, Europa/Mosca modifiche al fuso orario di cui hai bisogno. Per il territorio della Federazione Russa, PHP supporta i seguenti fusi orari:

  • Europa/Mosca
  • Europa/Samara
  • Europa/Kaliningrad
  • Europa/Volgograd
  • Asia/Anadyr
  • Asia/Kamchatka
  • Asia/Krasnojarsk
  • Asia/Magadan
  • Asia/Novokuznetsk
  • Asia/Novosibirsk
  • Asia/Omsk
  • Asia/Sachalin
  • Asia/Vladivostok
  • Asia/Jakutsk
  • Asia/Ekaterinburg

Puoi visualizzare un elenco di tutti i fusi orari disponibili seguendo il collegamento o eseguendo un comando che ti restituirà un elenco di fusi orari disponibili sul tuo server.

Print_r(DateTimeZone::listIdentifiers());


Questo è un breve articolo su come lavorare con i fusi orari quando si memorizzano valori di data/ora in un database. Il database o il linguaggio di programmazione che decidi di utilizzare non è fondamentale, poiché i fenomeni descritti nell'articolo sono universali. Mostrerò le mie azioni utilizzando l'esempio dell'utilizzo di una combinazione di MySQL e PHP. Il problema associato ai fusi orari è piuttosto banale. Molte persone spesso dimenticano la propria esistenza e alcuni la considerano qualcosa di eccessivamente complicato. In genere, quando configuri un database o utilizzi un servizio di web hosting, i fusi orari sono configurati per impostazione predefinita. Le impostazioni predefinite vanno bene se utilizzi un singolo server, ma cosa succede se decidi di spostarlo?

La stessa domanda è logica se disponi di più server in posizioni diverse.
Invece di memorizzare i fusi orari per ciascuna data, è meglio basarlo sull'ora solare e associarvi tutte le date. Questo metodo consente di passare all'ora solare prima che il valore venga archiviato nel database. In generale, è una buona idea usare semplicemente UTC +00:00.

Cos'è l'UTC

UTC sta per Coordinated Universal Time ed è il successore del Greenwich Mean Time (GMT). I due formati sono quasi identici, ma UTC è considerato lo standard accettato. In generale, l'UTC si basa su 40 fusi orari diversi. È consuetudine prendere le 00:00 come punto di partenza in UTC. In totale, ci sono 12 fusi orari principali, sia con valori positivi che negativi, oltre ad alcuni fusi orari aggiuntivi, come quelli di mezz'ora UTC +04:30. L'idea è che se hai un fuso orario UTC -05:00, allora dovrai sottrarre 5 ore dall'iniziale UTC +00:00 per ottenere la vestibilità desiderata. Cioè, se sono le 14:00 (o le 14:00) nel tuo fuso orario UTC-05:00(EST o fuso orario orientale), quindi UTC +00:00 sarà pari alle 19:00 (o alle 19:00).
  • Rappresentazione grafica dei fusi orari mondiali (Wikipedia)
  • Elenco delle abbreviazioni dei fusi orari (Wikipedia)

Ora di memorizzazione nel formato UTC +00:00

La prima cosa che dobbiamo fare è decidere quale fuso orario utilizzare per memorizzare tutti i nostri valori. Consiglio vivamente di prenderlo come base UTC +00:00- per nessun motivo particolare se non che è facile da ricordare e 0 rappresenta un punto di riferimento ideale. Dato che sappiamo che ci sono tutte le date UTC +00:00, diventa molto più semplice rappresentare l'ora corretta per ciascun utente in base ai fusi orari personali. Una volta che un utente ha selezionato (o abbiamo rilevato automaticamente) il proprio fuso orario, visualizzare l'orario appropriato per quell'utente diventa un luogo comune.

Impostazione del fuso orario predefinito

Supponendo che tutte le nostre date/ora siano archiviate in UTC, possiamo semplicemente impostare un fuso orario predefinito da utilizzare per la visualizzazione ogni volta. Ciò selezionerà automaticamente la data e l'ora per un utente specifico. In PHP, tutto ciò che dobbiamo fare è impostare il fuso orario, in questo modo:
date_default_timezone_set("EST");
Possiamo farlo in qualche blocco di inizializzazione all'inizio del nostro codice e il gioco è fatto: tutte le date verranno visualizzate in modo appropriato per il fuso orario in cui si trova l'utente.

Se vogliamo il pieno controllo su data e ora, possiamo costruire la funzione in questo modo:
funzione get_date($data) ( date_default_timezone_set("EST"); $data = date("Y-m-d H:i:s", strtotime($data)); date_default_timezone_set("UTC"); return $data; )

Configurazione di PHP per UTC +00:00

Naturalmente, le cose non sarebbero così semplici se non avessimo configurato il nostro sistema per utilizzare UTC come fuso orario predefinito. Sono sicuro che questo può essere fatto più o meno allo stesso modo in altri linguaggi, ma PHP funziona in questo modo:
data.fuso orario = UTC
Ora ogni volta che usiamo cose come la funzione tempo(), questo ci fornisce automaticamente l'ora UTC con l'offset appropriato in base all'ora del nostro server. Se vogliamo impostare le date in un database come MySQL, faremo così:
data("A-m-g H:i:s", ora());
Se non abbiamo accesso per modificare la configurazione PHP, dobbiamo impostare manualmente l'ora quando impostiamo la data, in questo modo:
data("Y-m-d H:i:s", ora() - data("Z"));

Configurazione di MySQL per UTC +00:00

L'impostazione diretta della data come abbiamo fatto sopra è applicabile se non abbiamo accesso per modificare i parametri di configurazione di MySQL. Tuttavia, se vogliamo utilizzare TIMESTAMP, che di solito si aggiorna automaticamente, o una funzione di data MySQL simile ORA() quindi dobbiamo configurare MySQL per utilizzare UTC come fuso orario predefinito.

In MySQL questo viene fatto impostando l'offset UTC, cosa che può essere fatta altrettanto facilmente come in PHP apportando le seguenti modifiche:
fuso orario predefinito = "+00:00"

Aggiornamento di date/orari esistenti

Se decidi di standardizzare i fusi orari utilizzando UTC, dove si trova il fuso orario predefinito UTC +00:00 offset, l'ora corrente nel database verrà interrotta.

Fortunatamente, MySQL fornisce una funzionalità utile che ci dà la possibilità di aggiornare facilmente i fusi orari esistenti.

NOTA: Se sono presenti timestamp, è necessario prima aggiornarli.

Possiamo cercare tutti i campi data e ora nel nostro database utilizzando la seguente query:
SELECT * FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA`="nome_tabella" AND (`DATA_TYPE`="data/ora" OR `DATA_TYPE`="dataora" OR `DATA_TYPE`="data");
Da qui possiamo utilizzare la seguente query per aggiornare le date/ora nelle nostre tabelle:
AGGIORNA `nome_tabella` SET `timestamp`=CONVERT_TZ(`timestamp`, "-05:00", "+00:00");
Dove -05:00 - il fuso orario corrente nel formato in cui è memorizzata l'ora (come nel caso precedente, si riferisce all'Est). Fuso orario +00:00 , in cui vogliamo convertire, in questo caso si riferisce a UTC.

21 marzo 2013 alle 12:58

Dater: determina il fuso orario, localizza e formatta l'ora in PHP

  • PHP

Quando, nello sviluppo di un progetto web, si pone il compito di tenere conto dei fusi orari degli utenti, ogni volta la soluzione sembra dover essere reinventata. Dei tanti progetti a me noti che hanno risolto questo problema, non ricordo una sola soluzione che possa essere definita semplice, trasparente per l'intera architettura e universale.

Ma cosa succede se si desidera solo poche righe di codice e in modo che il resto del codice non scopra mai che i dati devono essere inviati al client in un fuso orario diverso e che nei dati ricevuti dal client, il l'ora può essere indicata in un fuso orario diverso da quello del server? Per risolvere questo e tanti altri problemi, oggi ti parlerò di una libreria per PHP sintetica e funzionale.

E quindi, ecco Dater e le sue caratteristiche principali:

  • Formati vincolanti
  • Localizzazione di testi e formati
  • Espansione dell'elenco delle opzioni di formattazione
  • Rilevamento automatico del fuso orario
  • Converti l'ora in base al fuso orario
  • Conversione automatica dell'ora in $_GET, $_POST, $_REQUEST tenendo conto del fuso orario
  • Conversione automatica del fuso orario nel modello di dati inviato
Tralasciamo per dessert le righe di codice promesse per il rilevamento e l'elaborazione automatici del fuso orario dell'utente, ma per ora esaminiamo brevemente le principali funzionalità di Dater con esempi.

Formati vincolanti

Ti consente di standardizzare una serie di formati utilizzati per un progetto e di lavorarci per nome:

$dater = new Dater\Dater(new Dater\Locale\En()); $dater->format(time(), "d/m/Y"); // 2013/03/14 $dater->addFormat("slashedDate", "d/m/Y"); $dater->format(time(), "slashedDate"); // 14/03/2013 $dater->slashedDate(time()); // 14/03/2013

Espansione delle opzioni di formattazione

Tutte le opzioni di formattazione da date() sono disponibili e possono anche essere sovrascritte ed estese:

$dater->addFormatOption("ago", funzione (DateTime $datetime) ( return floor((time() - $datetime->getTimestamp()) / 86400). "giorni fa"; )); $dater->format(time() - 60*60*24*7, "d F Y, ago"); // 14 marzo 2013, 7 giorni fa

Supporto locale

$dater->setLocale(new Dater\Locale\En()); echo $data->data(); // 21/03/2013 echo $dater->now("j F Y"); // 21 marzo 2013 $dater->setLocale(Dater\Dater::getLocaleByCode("ru")); echo $data->data(); // 21/03/2013 echo $dater->now("j F Y"); // 21 marzo 2013

Metodi standard per i formati server e utente, tenendo conto delle impostazioni locali

echo $data->data(); // 21/03/2013 (fuso orario del client, dipende dalla locale) echo $dater->time(); // 5:41 (fuso orario del client, dipende dalla locale) echo $dater->datetime(); // 21/03/2013 5:41 (fuso orario del client, dipende dalla locale) echo $dater->isoDate(); // 21-03-2013 (fuso orario del client) echo $dater->isoTime(); // 05:41:28 (fuso orario del client) echo $dater->isoDatetime(); // 21-03-2013 05:41:28 (fuso orario del client) echo $dater->serverDate(); // 21-03-2013 (fuso orario del server) echo $dater->serverTime(); // 09:41:28 (fuso orario del server) echo $dater->serverDatetime(); // 21-03-2013 09:41:28 (fuso orario del server)

Conversione di data-ora tenendo conto del fuso orario

$dater->setServerTimezone("Europa/Mosca"); $dater->setClientTimezone("Europa/Londra"); echo $dater->serverDatetime(); // 21-03-2013 08:18:06 echo $dater->isoDatetime(); // 21-03-2013 04:18:06 echo $data->ora(); // 04:18
Vale la pena ricordare che quando si chiama $dater->setServerTimezone("Europe/Moscow"); La funzione date() e la classe DateTime restituiranno l'ora nel fuso orario appena impostato. Per disabilitarlo, passare false come secondo parametro al metodo.

E infine ciò che era stato promesso

Codice che ti consentirà di determinare automaticamente il fuso orario del cliente e di visualizzarne la data e l'ora attuali:

Nell'intestazione dello script di inizializzazione globale

$dater = new Dater\Dater(new Dater\Locale\Ru(), "Europa/Mosca"); $timezoneDetector = nuovo Data\TimezoneDetector(); $dater->setClientTimezone($timezoneDetector->getClientTimezone()); $dataHandler = nuovo Dater\DataHandler($dater); $dataHandler->enableOutputTimezoneHandler(); $dataHandler->convertRequestDataToServerTimezone();
Nel modello principale

getHtmlJsCode() ?>
Ora tutte le stringhe AAAA-MM-GG HH:MM:SS nei dati inviati verranno sostituite con AAAA-MM-GG HH:MM:SS nel fuso orario del client rilevato automaticamente. Se è necessario visualizzare la data e l'ora in un formato specifico, è sufficiente aggiungere AAAA-MM-GG HH:MM:SS[Í m d] o AAAA-MM-GG HH:MM:SS dove data è il formato associato a Dater . Puoi anche generare e formattare il formato timestamp: 1363853607.

Ad esempio, i seguenti dati

Formato data/ora: 1363238564 (non cambierà) Formato data/ora: 1363238564 Formato data/ora: 1363238564 Formato data/ora server: 2013-03-14 09:22:44 Formato data/ora server: 2013-03-14 09:22:44 Formato data/ora server: 2013 - 14-03 09:22:44
Verrà convertito automaticamente in

Formato data/ora: 1363238564 (non cambierà) Formato data/ora: 2013/03/14 Formato data/ora: 03/14/2013 07:22 Formato data/ora server: 2013/03/14 Formato data/ora server: 07:22 Formato data/ora server: 2013- 03-14 07:22:44

Allo stesso tempo $dataHandler->convertRequestDataToServerTimezone(); farà in modo che tutti i dati AAAA-MM-GG HH:MM:SS provenienti dal client vengano convertiti nel fuso orario del server AAAA-MM-GG HH:MM:SS. In questo modo, il server non saprà mai che il client sta ricevendo e inviando una data-ora in un fuso orario diverso.

Certo, questo è un modo un po’ estremo di gestire i fusi orari. Una soluzione più universale e tradizionale sarebbe quella di evitare di utilizzare $dataHandler->enableOutputTimezoneHandler(); ed è sufficiente inquadrare l'inserimento di ciascuna data-ora con una chiamata al metodo di formattazione appropriato. Per esempiodata($datetimeOrTimestamp) ?> .

sul progetto

Ammetto onestamente di essere l'autore di questa libreria e sarò molto grato per qualsiasi critica e aiuto per migliorarla. Le fonti sono pubblicate su

date_default_timezone_set utc(6)

new PDO("mysql:host=localhost;dbname=nametable", "username", "password", );

Queste date devono essere confrontate in MySQL utilizzando la funzione NOW() per restituire la differenza in ore, ad esempio:

SELECT TIMESTAMPDIFF (ora, NOW (), finalize_at) DA piani;

Ma il problema è che la funzione PHP date("Ymd H:i:s") utilizza l'impostazione del fuso orario PHP e la funzione NOW() prende l'ora MySQL dal server MySQL.

Sto cercando di risolvere questo:

  1. date_default_timezone_set("Europa/Parigi"); Funziona solo per PHP.
  2. date.timezone= "Europa/Parigi"; Funziona solo per PHP.
  3. SELECT CONVERT_TZ(now(), "GMT", "MET"); Questo ritorna vuoto.
  4. mysql> SET time_zone = "Europa/Parigi"; Ciò genera un errore dalla console MySQL.

E il fuso orario per MySQL non cambia.

Esiste un modo per modificare il fuso orario per PHP e MySQL senza doverlo fare dalla console MySQL o impostare la modifica del fuso orario da qualche parte in php.ini e rendere tali valori disponibili sia per PHP che per MySQL.

Apprezzo davvero il tuo supporto.

Puoi farlo facilmente con solo due righe di PHP.

$tz = (new DateTime("now", new DateTimeZone("Asia/Kabul")))->format("P"); $pdo -> exec ("SET time_zone="$tz";" );

Per PHP utilizzare questa funzione:

date_default_timezone_set() predefinito - ora - zona = "fuso orario"

Se hai il privilegio radice, puoi impostare il valore dell'orologio globale del server in fase di esecuzione utilizzando questa istruzione:

IMPOSTA GLOBALE time_zone = fuso orario;

Fuso orario per connessione. Ogni client che si connette ha il proprio fuso orario, specificato dalla variabile time_zone. Inizialmente la variabile di sessione prende il suo valore dalla variabile globale time_zone, ma il client può modificare il proprio fuso orario utilizzando questa istruzione:

SET fuso_ora = fuso orario;

Il metodo migliore imposta il fuso orario in PDO MySQL:

Se necessario, per errore è possibile utilizzare: date("P") Esempio:

nuova DOP ( "mysql:host=localhost;dbname=nametable", "nome utente", "password", [ PDO :: MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8;SET time_zone = "". data("P"). """]);

Posso modificare il fuso orario mysql predefinito dalla sezione delle variabili modificando la riga che dice "fuso orario" in phpmyadmin.

Qui puoi anche cambiare il formato e molti altri che puoi trovare nel supporto mysql http://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html, spero che ti aiuti.

$unsafe_variable = (è_numerico($_POST["user_input"]) ? $_POST["user_input"] : "");

Ed è molto meglio usare queste funzioni per convalidare l'input mysql_real_escape_string.